2016-10-20 3 views
2

Hallo, ich bin ein Neuling und ich habe ein Problem mit einer Funktion. Ich habe zwei Listen:Python, Entfernen von Elementen aus Listen

>>> a = ['a0', 'b1', 'a2', 'b3', 'a4', 'b5'] 
>>> b = ['b0', 'a1', 'b2', 'a3', 'b4', 'b5'] 

Ich möchte Elemente gemeinsam und die größere in der gleichen Position entfernen; mein ausgegeben werden soll:

>>> function(a,b) 
>>> a 
['a0', 'a2', 'a4'] 
>>> b 
['a1', 'a3'] 

Ich versuchte dies:

>>> def function(a,b): 
     for i1,i2 in zip(a,b): 
      if i1 == i2: 
       a.remove(i1) 
       b.remove(i2) 
      elif i1 < i2: 
       b.remove(i2) 
      else: 
       a.remove(i1) 

Aber es gibt mir:

>>> function(a,b) 
>>> a 
['a0', 'b1', 'a2', 'b3', 'a4', 'b5'] 
>>> b 
['a1', 'a3', 'b5'] 

Was mein Fehler ist?

+0

Ich bin damit einverstanden: Die Gründe sind die gleichen, aber es ist schwierig, die Verbindung sofort zu sehen. –

Antwort

4

In Python 2, die funktionieren würde, aber in Python 3 zip hat eine Generatorfunktion geworden: Sie schafft die Elemente auf Nachfrage (mehr Info here über verschiedene zip, izip Sachen und Unterschiede zwischen 2 & 3)

was bedeutet, dass, da Sie a und b in der Schleife ändern, es über wechselnde Listen iterieren (es ist etwas weniger offensichtlich wegen der zip Funktion).

Um das zu beheben, RV eine Kopie Ihres Eingangs

listet
def function(a,b): 
     for i1,i2 in zip(a[:],b[:]): 
      if i1 == i2: 
       a.remove(i1) 
       b.remove(i2) 
      elif i1 < i2: 
       b.remove(i2) 
      else: 
       a.remove(i1) 
+1

Vielleicht möchten Sie einen Link zu [this] (http://stackoverflow.com/questions/1663807/how-can-i-iterate-through-two-lists-in-parallel-in-python) Frage - die Antwort erklärt das Problem im Detail. – Maurice

+1

Beachten Sie, dass dies möglicherweise nicht funktioniert, wenn doppelte Werte in der Liste vorhanden sind, da 'remove' das * first * -Vorkommen entfernt. Es könnte besser sein, nach Index zu entfernen. – brianpck

+0

Es gibt ein Problem, wenn doppelte Werte vorhanden sind. das würde bedeuten, den 'zip'-Kram fallen zu lassen und zu einem guten alten' while i

0

ich Ihren ursprünglichen Code in meinem Python 2.7 und es funktioniert tatsächlich ausgeführt haben, die Werte ausgegeben, die Sie suchen. Aber hier ist eine kurze Version für Sie zu prüfen, die auch funktioniert der Trick:

def function(a,b): 
    for i1, i2 in zip(a,b): 
     if i1 <= i2: 
      b.remove(i2) 
     if i2 <= i1: 
      a.remove(i1) 

a = ['a0', 'b1', 'a2', 'b3', 'a4', 'b5'] 
b = ['b0', 'a1', 'b2', 'a3', 'b4', 'b5'] 

function(a, b) 


print a 
>>>['a0', 'a2', 'a4'] 

print b 
>>>['a1', 'a3'] 
+1

Überprüfen Sie den ersten Satz meiner Antwort ... es funktioniert in Python 2. Das ist nicht der Punkt. und Ihre "prägnantere" Version führt 2 Tests durch, wenngleich nur 1 benötigt wird. –

Verwandte Themen