2012-05-10 74 views
1

我有一個排序列表,我想插入一個字符串,如果它匹配列表中的模式。匹配並插入python排序列表

Example : 

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

以上列表按排序順序排列。我需要按排序順序插入名稱,並且如果名稱已經存在,則應該在現有名稱之前插入名稱。

Example 
Name 'Eva Henry' 

由於Eva已經在列表中,因此匹配模式後應該在Eva A之前插入模式。如果名稱不匹配,則應按排序順序將其插入列表中。輸出應該是這樣的:

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

任何幫助將不勝感激。

謝謝

+0

*「如果該名稱已存在,那麼它應該在現有名稱之前插入「*我可以問爲什麼這個請求? –

+0

聽起來像一個家庭作業問題。如果是,請將其標記爲功課。 –

+0

我們對特權客戶有這樣的要求。是的它真的很奇怪,但它需要做:( – PratapSingh

回答

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'] 
+1

您爲什麼幫助他們編寫自殺程序並傳播錯誤代碼? :-)對不起,你的代碼很好,我的意思是算法。 – gecko

+0

是的......在我重讀那個之後,我意識到這個insort方法是行不通的。如果我們對這些名稱進行標記,我們也可以創建一個字典,其中第一個標記是鍵,值是一個列表,我們將名字像堆棧一樣推入,然後使用一個展開函數返回一個列表(或生成器)需要的時候。 – parselmouth

+0

優秀點[gecko](http://stackoverflow.com/users/774340/gecko)。如果要求如所描述(並且希望不是),則列表甚至不再是正確的數據結構。 – jgritty

0

OK,我會踏踏實實,投票支持這一點,但我不能讓這種立場。這是一個糟糕的設計模式,如果這是家庭作業,你應該強烈抱怨。

我會將該名稱作爲一個帶有頻率的元組存儲('Fred Bloggs',2),或者使用一個dict()或其他東西:只是任何東西,但請不要這樣。 Google'python dict()'。

編輯:其實一個字典()是不是有序的嗎?哦,我的生活失敗了。聳肩。

編輯:我也是指元組列表。

+0

不知道一個元組是正確的數據結構,只有第一個名字似乎需要匹配。 – jgritty

+1

[heapq](http://docs.python.org/release/3.0.1/library/heapq.html)是一個不錯的選擇。 –

+0

@Jgritty:第二個元素是它出現的次數。第一個元素是全名。 – gecko

3

在我看來,沒有愚蠢的問題。如果名稱是全名,只有名字是排序的關鍵,那麼總會有一些有趣的想法和需要解決的問題。您可以使用對開這樣:

>>> 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' 

現在,使用對開找到第一個名稱列表所需位置:

>>> 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'] 
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