2012-04-02 2 views
2

Ich habe zwei Listen:Elemente an der gleichen Position (Index) von zwei synchronisierten Listen löschen?

l1 = ['#', '1', '#', '!'] 
l2 = ['S', 'T', 'K', 'M'] 

Wenn es eine ‚#‘ in l1 ich es entfernen will, und zu entfernen, was auch immer an der gleichen Position in l2 ist. Dies ist, was ich (unter mehreren anderen Dingen) versucht:

for i in range(len(li[j])): 
    for k in range(len(l2[n])): 
     if j == "#": 
      li.remove([j][i]) 
      l2.remove([n][k]) 

Aber es beklagt, dass j nicht definiert ist. Ich möchte das Ergebnis wie folgt aussehen:

l1 = ['1', '!'] 
l2 = ['T', 'M'] 

Ich würde für Anregungen dankbar!

+0

Wo setzen Sie 'J'? Und zu was? –

+0

'li.remove' sollte es' l1' sein, und Ihre Schleifenvariablen sind 'i',' k' es gibt kein 'j', daher ist' j' nicht definiert – avasal

Antwort

1

Hier ist ein einfaches und einfache Methode zu verstehen:

a = ["#", "1", "#", "2", "3", "#"] 
b = ["a", "b", "c", "d", "e", "f"] 

a,b = zip(*[[a[i], b[i]] for i in range(len(a)) if a[i]!="#"]) 
print a 
print b 

Persönlich ich es viel simplier zu verstehen und effektiver (sprich: „schneller“) zu finden als die Methode @jamylak vorgeschlagen.

Ausgang:

>>> 
('1', '2', '3') 
('b', 'd', 'e') 
+0

Ich würde nicht sagen, dass dies einfacher zu verstehen ist als meine Methode. Sie rufen zu jeder verwendeten Variable wiederholt auf, während meine Methode eingebaute Methoden verwendet, so dass jede Variable nur einmal verwendet werden muss. Die Namen, z. Filter scheinen die Methode für jeden mit Erfahrung mit Python klar zu machen. – jamylak

+0

@jamylak Ich bin ein Neuling in Python, schien mir, dass Zippen es zweimal mehr Rechenleistung als mit einem einfachen Generator. Jetzt scheint es, ich könnte mich irren, da integrierte Funktionen schneller sind als ein Stück Python-Code. – bezmax

+0

Natürlich, obwohl Python nicht immer um Geschwindigkeit geht. Manchmal opfere ich Geschwindigkeit für Lesbarkeit, nur damit der Code besser aussieht. Wenn ich alle Methoden von itertools verwenden würde, könnte ich die Zips in Generatoren umwandeln, und das würde viel schneller laufen, obwohl es bedeuten würde, die Daten wieder in eine Liste zu verwandeln, die es für dieses Beispiel nicht wert ist zu posten. – jamylak

0

Da Sie in beiden Listen immer auf den gleichen Index zugreifen, ist eine Schleife ausreichend. Sie müssen jedoch vorsichtig sein, wenn die Listen nicht die gleiche Länge haben.

Darüber hinaus aus einer Liste zu entfernen, während sie über sie iterieren ist fehleranfällig, die folgende Lösung speichert alle Indizes in einer Entnahmeliste und den Index aus beiden Listen in einem zweiten Sprung entfernen:

l1 = ['#', '1', '#', '!']  
l2 = ['S', 'T', 'K', 'M'] 
remove = [] 
for i in range(len(l1) - 1): 
    if l1[i] == '#': 
     remove.insert(0, i) 

for i in remove: 
    l1.pop(i) 
    l2.pop(i) 

for i in l1: 
    print i 
for i in l2: 
    print i 
6
>>> l1 = ['#', '1', '#', '!'] 
>>> l2 = ['S', 'T', 'K', 'M'] 

>>> l1,l2 = zip(*((x,y) for x,y in zip(l1,l2) if x!='#')) 
>>> l1 
('1', '!') 
>>> l2 
('T', 'M') 

Mit filter

>>> l1,l2 = zip(*filter(lambda x: '#' not in x,zip(l1,l2))) 
>>> l1 
('1', '!') 
>>> l2 
('T', 'M') 

Mit itertools

>>> from itertools import compress 
>>> l1,l2 = zip(*compress(zip(l1,l2),(x!='#' for x in l1))) 
>>> l1 
('1', '!') 
>>> l2 
('T', 'M') 
Verwandte Themen