2009-07-17 238 views
10

任何人都可以提出一個很好的解決方案,如果想根據每個嵌套列表的第一個元素來評估重複項,那麼可以從嵌套列表中刪除重複項?從Python列表中刪除重複項

主要名單如下:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]] 

如果與第一位置[k][0]已經發生了,那麼我想刪除列表,並得到這樣的結果,同樣的元素另一個列表:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33]] 

你能提出一個算法來實現這個目標嗎?

回答

28

你關心維護命令/哪個重複被刪除?如果不是,那麼:

dict((x[0], x) for x in L).values() 

會做到這一點。如果你想維持秩序,並希望保持,那麼你找到的第一個:

def unique_items(L): 
    found = set() 
    for item in L: 
     if item[0] not in found: 
      yield item 
      found.add(item[0]) 

print list(unique_items(L)) 
0

我不知道你所說的「另一個列表」的意思,所以我想你說的裏面大號

a=[] 
L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']] 
for item in L: 
    if not item[0] in a: 
     a.append(item[0]) 
     print item 
+0

,如果你使用「一」一組這將是更有效的 - 你是O(N^2)使用這樣的列表,並使用一個集合分攤O(N)。 – RichieHindle 2009-07-17 13:58:07

+0

,但沒有想到,感謝您的信息。不過,該代碼可以在不帶set的舊Python版本中使用。 ;) – ghostdog74 2009-07-17 14:14:17

3

這些名單使用的字典,而不是像這樣:

L = {'14': ['65', 76], '2': ['5', 6], '7': ['12', 33]} 
L['14'] = ['22', 46] 

,如果你正在接收來自某個外部來源的第一個列表,將其轉換爲如下形式:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]] 
L_dict = dict((x[0], x[1:]) for x in L) 
0

如果順序並不重要,下面的代碼

print [ [k] + v for (k, v) in dict([ [a[0], a[1:]] for a in reversed(L) ]).items() ] 

[ '2', '5', '6'],[ '14', '65', '76'],[ '7', '12', '33']]

0

使用熊貓:

import pandas as pd 

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']] 

df = pd.DataFrame(L) 
df = df.drop_duplicates() 

L_no_duplicates = df.values.tolist() 

如果你想在特定列砸重複只使用替代:

df = df.drop_duplicates([1,2])