2009-07-17 15 views
10

Kann jemand eine gute Lösung vorschlagen, um Duplikate aus verschachtelten Listen zu entfernen, wenn Duplikate basierend auf dem ersten Element jeder verschachtelten Liste ausgewertet werden sollen?Entfernen von Duplikaten aus Listen in Python

Die Hauptliste sieht wie folgt aus:

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

Wenn eine andere Liste an erster Stelle mit dem gleichen Elemente ist [k][0] die bereits stattgefunden hätte, dann würde Ich mag diese Liste entfernen und dieses Ergebnis zu erhalten:

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

Können Sie einen Algorithmus vorschlagen, um dieses Ziel zu erreichen?

Antwort

28

Sie kümmern sich um die Erhaltung der Reihenfolge/welche Duplikat wird entfernt? Wenn nicht, dann:

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

wird es tun. Wenn Sie Auftrag erhalten wollen, und wollen den ersten halten finden Sie dann:

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

Ihre Konvertierung zu einem Diktat war so viel eleganter als der Gedanke, dass ich es gestohlen habe :) – Jiaaro

+0

* als MINE (Ich wünschte wirklich, ich könnte einen Kommentar bearbeiten) – Jiaaro

0

ich bin nicht sicher, was Sie unter „einer anderen Liste“ gemeint, so dass ich nehme an, Sie

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

Diese effizienter wäre, wenn Sie einen Satz für 'a' verwendet - Sie sind O (N^2) Verwenden Sie eine Liste wie diese und Amortized O (N) mit einem Satz. – RichieHindle

+0

das ist nicht in den Sinn gekommen, danke für die Info. Trotzdem funktioniert dieser Code in älteren Python-Versionen, die nicht mit set geliefert werden. ;) – ghostdog74

3

verwenden, um eine dict statt wie so diese Listen innerhalb L sagen:

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

, wenn Sie empfangen die erste Liste von einer externen Quelle, wandeln Sie sie wie folgt um:

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

Wenn die Reihenfolge keine Rolle spielt, Code unter

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

gibt

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

0

Verwenden Sie Pandas:

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() 

Wenn Sie nur Duplikate fallen in bestimmten Spalten wollen anstatt:

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