2

ソートされたリストがあり、リスト内のパターンと一致する場合は文字列を挿入したいと思います。

Example :

Sorted List
['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']

上記のリストはソートされた順序です。ソートされた順序で名前を挿入する必要があります。また、名前がすでに存在する場合は、既存の名前の前に挿入する必要があります。

Example 
Name  'Eva Henry'

Evaはすでにリストに含まれているため、パターンを一致させた後、「EvaA」の前に挿入する必要があります。名前が一致しない場合は、リストに並べ替えられた順序で挿入する必要があります。出力は次のようになります。

 Sorted List
    ['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']

どんな助けでもありがたいです。

ありがとうございました

4

4 に答える 4

3

私の意見では、愚かな質問はありません。名前がフルネームを意味し、名だけがソートの鍵である場合、常に面白いアイデアがあり、問題を解決する必要があるかもしれません。次のようにbisectを使用できます。

>>> fullnames = ['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
>>> names = [full.split()[0] for full in fullnames]
>>> names
['Amy', 'Dee', 'Eva', 'Gin', 'Joy', 'Kay', 'Mae', 'Pam']

したがって、別のフルネーム(前の場合と同じ方法でxx抽出されたファーストネーム)の位置を見つけるために使用されるファーストネームの並列リストがあります。x

>>> xx = 'Eva Henry'
>>> x = xx.split()[0]
>>> x
'Eva'

次に、bisectを使用して、名リストで目的の位置を見つけます。

>>> import bisect
>>> pos = bisect.bisect_left(names, x)

次に、両方のリストを更新します。

>>> fullnames.insert(pos, xx)
>>> names.insert(pos, x)

結果は次のとおりです。

>>> fullnames
['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
>>> names
['Amy', 'Dee', 'Eva', 'Eva', 'Gin', 'Joy', 'Kay', 'Mae', 'Pam']
于 2012-05-10T21:41:21.030 に答える
0

これは、あなたが望むことを行う完全な答えですが、ばかげています。エッジケースはテストしませんでした。

sorta_sorted_list = ['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']

print sorta_sorted_list

def insert_kinda_sorted(name, sorta_sorted_list):
    new_list = []
    fname = name.split()[0]
    inserted = False
    for index in range(len(sorta_sorted_list)):
        if not inserted:
            if sorta_sorted_list[index].split()[0] == fname:
                new_list.append(name)
                inserted = True
            if sorta_sorted_list[index] > name:
                new_list.append(name)
                inserted = True
        new_list.append(sorta_sorted_list[index])

    return new_list

sorta_sorted_list = insert_kinda_sorted('Eva Henry', sorta_sorted_list)
print sorta_sorted_list

sorta_sorted_list = insert_kinda_sorted('Joe Blow', sorta_sorted_list)
print sorta_sorted_list

出力は次のとおりです。

['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joe Blow', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
于 2012-05-10T21:24:42.707 に答える
0

OK、これには反対票を投じますが、これをそのままにしておくことはできません。これはひどいデザイン パターンであり、これが宿題である場合は、強く文句を言う必要があります。

名前を頻度 ('Fred Bloggs', 2) のタプルとして保存するか、dict() などを使用します。Google 'python dict ()'.

編集:実際には dict() は順序付けられていませんか? うーん、人生失敗。肩をすくめる。

編集:また、タプルのリストを意味しました。

于 2012-05-10T21:35:17.397 に答える
0

これが私の解決策です。簡単だと思います

:

#spliting against whitespace
first_name = name.split()

#Stroting the first name of the user
first_name = first_name[0]

#Matching the pattern 
match = re.compile(first_name,re.IGNORECASE)
ind = ''

for i in sort_names:
        if re.match(match, i):
                ind = sort_names.index(i)
                break
                #If name matches for the first time end the loop and do insert name in the sorted list

if ind != '':
        sort_names.insert(ind, val)
        print ""
        print sort_names
else:
        bisect.insort(sort_names, val)
        print sort_names
于 2012-05-11T08:14:50.283 に答える