2017-01-20 10 views
0

Ich versuche, eine neue Liste von Listen zu erstellen, indem ich die Zeilen mit einem doppelten Wert in der vorhandenen Liste von Listen lösche.Elemente in der Liste der Listen in Python vergleichen

fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]] 
sec = [] 

for row in fir: 
    if sec is None: 
     sec.append(row) 
    elif row[0] not in sec: 
     sec.append(row) 

print(sec) 

Erwartete Leistung: [[ 'A35', 1], [ '3r', 6], [5, 9]]

Actual output: [[ 'A35', 1] , ['a35', 2], ['3r', 6], ['3r', 8], [5, 9]]

Ich möchte eine Liste von Listen erstellen, in denen die Werte der Zeile [0 ] sind einzigartig und nicht doppelt vorhanden (zB sollte die Zeile mit 'a35' nur einmal enthalten sein)

Wie kann ich das erreichen?

Antwort

1

Ihr aktueller Code schlägt fehl, weil nach der ersten Iteration sec wie folgt aussieht: [['a35',1]]. In der zweiten Iteration row hat Wert von ['a35',2], die nicht von sec gefunden werden kann, damit es dort angefügt wird.

Sie könnten groupby verwenden, um die inneren Listen basierend auf dem ersten Element zu gruppieren. groupby kehrt iterable von (key, it) Tupels wo key Wert von zweiten Parametern zurückgegeben und it ist iterable der Elemente innerhalb der Gruppe:

>>> from itertools import groupby 
>>> fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]] 
>>> [next(g) for _, g in groupby(fir, lambda x: x[0])] 
[['a35', 1], ['3r', 6], [5, 9]] 

anzumerken, dass oben davon ausgeht, dass Listen mit dem gleichen ersten Elemente nebeneinander sind in seq . Wenn das nicht der Fall ist, können Sie seq sortieren, bevor Sie es an groupby übergeben, aber das funktioniert nur, wenn die ersten Elemente als Schlüssel verwendet werden können. Mit Ihrer Daten, die nicht der Fall ist, da Strings und ints sind, die nicht verglichen werden kann, auf Python 3. Sie die Elemente in der OrderedDict sammeln konnte aber:

from collections import OrderedDict 
fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9],['a35',7]] 

d = OrderedDict() 
for x in fir: 
    d.setdefault(*x) 

print([list(x) for x in d.items()]) 

Ausgang:

[['a35', 1], ['3r', 6], [5, 9]] 
1

können Sie speichern Sie einfach den eindeutigen Wert (die ersten Daten in dem Tupel), Sie sind falsch, weil Sie das erste Tupel auf alle Daten vergleichen (Vergleich ‚a35‘ zu [ ‚a35‘, 1])

fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]] 
sec = [] 

index = [] 
for f in fir: 
    if not f[0] in index: 
     index.append(f[0]) 
     sec.append(f) 

print(sec) 
0

Verwenden List Verständnis zu erreichen Diese ve:

sec=[i for i in fir if i[0] not in [fir[idx][0] for idx in xrange(0,fir.index(i))]] 

Dies wählt jedes Element aus fir und vergleichen das erste Element des Elements mit dem ganzen Artikel aus dem Index 0 bis zum Index dieses Elements.

Wie Sie nur zwei Elemente in der inneren Liste haben, und Sie wollen nicht, um Duplikate haben, würde

Wörterbuch die perfekte Datenstruktur für Ihren Fall gewesen.

+0

Ich habe das versucht und es hat funktioniert !! Vielen Dank!! –

0

Ich denke, wenn Sie die Tanne loopen, sollten Sie eine Liste für die Aufnahme hinzufügen, die Sie in die Sec.

Verwandte Themen