2014-11-04 71 views
2

我發誓我首先搜索了它,並發現了很多「可以工作 - 如果適應」,但沒有什麼幫助。我有什麼是元組的形式列表:Python3根據索引的值中的一個值唯一化元組列表

[('', '[email protected]'), ('Andrea', '[email protected]'), ('Your Book', '[email protected]'), ..] 

在這種情況下,這是一個元組列表,有一個「名稱」作爲第一個值,而「電子郵件」作爲第二個價值,所有指標。並且列表沒有以任何特定的方式排序(還)。

我需要的是一個乾淨的和可以理解的(我不一定要找的俏皮話,我甚至不能讀取)的方式來產生「uniquified」列表中,但這些規則/警告:

  • 只有在找到元組第二個值的副本(在這種情況下,它恰好是電子郵件地址,並且它將是「[email protected]」)時,纔會刪除元組。
  • 不要消除所有重複元組的實例。我需要保留一個,並且要保留的那個應該是第一個對象的len()最多的元組。 (在這種情況下,重複的元組,它只會保留元組(「你的書」,「[email protected]」)

在這個最小例如最後的結果將是:

[('Andrea', '[email protected]'), ('Your Book', '[email protected]'), ..] 

,因爲我知道如何排序未排序的元組的列表不要緊,如果輸出未下令或排序感謝

回答

2

方法1:收集所有的名字

如果我們想最易懂的版本,不靈巧,可能像

pairs = [('', '[email protected]'), ('Andrea', '[email protected]'), ('Your Book', '[email protected]')] 

data = {} 
for name, email in pairs: 
    if email not in data: 
     data[email] = [] 
    data[email].append(name) 

output = [(email, max(data[email], key=len)) for email in data] 

會工作。這將問題分解爲兩部分:建立一個以電子郵件地址爲關鍵字和可能的名稱列表作爲值的字典;並循環所有的電子郵件地址,並獲得最長的名字。

第一部分可以使用setdefault(例如,

for name, email in pairs: 
    data.setdefault(email, []).append(name) 

但並非所有人都熟悉這一點。


方法2:排序,使獨特的

或者,我們可以通過電子郵件,姓名長度進行排序,然後建立從一本字典,將只保留看到的最後一個鍵/值對:

>>> pairs.sort(key=lambda x: (x[1], len(x[0]))) 
>>> data = {v: k for k,v in pairs} 
>>> [(v,k) for k,v in data.items()] 
[('Andrea', '[email protected]'), ('Your Book', '[email protected]')] 
+0

感謝您解釋這兩種方法,它可以想象試圖抽象自己的問題。我正在執行#2,但是這是做了哪些工作,謝謝:) – newyuppie 2014-11-04 04:32:26

0

可能做到這一點最簡單的方法是使用一組這樣的:

L = [('', '[email protected]'), ('Andrea', '[email protected]'), ('Your Book', '[email protected]'), ..] 

emails = set() 

result_L = [] 

for item in L: 
    if item[1] in emails: 
     # this email address is already seen 
     continue 

    result_L += [item] 
    emails.add(item[1]) 

不過,如果你想保留的最後一個項目,你可以使用這個(在最後,你可能想扭轉result_L):

for i in reversed(L): 
    # ... 

還有很多其他的方法可以做到這一點,太。例如,請考慮使用dict

result_dict = {} 

for item in L: 
    result_dict[item[1]] = item[0] 

result_L = [(y, x) for (x, y) in result_dict.items()] 
1

你可以建立一個使用第二個條目爲你的關鍵一本字典。字典具有不含任何重複的特性。如果您的第一個元素的長度構建字典之前進行排序,它會爲你提供你所追求的:

your_list_sorted = sorted(your_list, key=lambda x: len(x[0])) 
out = dict((v, k) for k, v in your_list_sorted) 

如果你需要以列表的形式您的輸出,你可以做out_list = list(out.items())得到它。

+0

我最終使用了@ DSM提出的類似方法,它使用了Dictionary。但在你的情況下,它扭轉了它,所以這是一個額外的步驟。但你的答案顯然也有效,所以+1。 – newyuppie 2014-11-04 04:34:10

相關問題