2016-06-16 26 views
-3
def purify(ls): 
    y = ls 
    for i in ls: 
     if i % 2 != 0: 
      y = y.remove(i) 

    print y 

Der folgende Code schlägt fehl, wenn ich die Liste übergebe (4, 5, 5, 4). Es gibt (4, 5, 4) anstatt (4, 4) zurück. Was ist hier falsch ? Ich bin nicht in der Lage zu verstehen, warum Änderungen in der y-Liste die ursprüngliche Liste ls beeinflussen.Entfernen der ungeraden Nummer aus der Liste

Antwort

1

Tun Sie das.

In [1]: a = (4, 5, 5, 4) 
In [2]: result = [i for i in a if not i % 2] 
In [3]: result 
Out[1]: [4, 4] 

In Funktion.

def purify(ls): 
    return [i for i in ls if not i % 2] 

Um mehr zu verstehen, erweitern ich meinen Code.Von diesem können Sie verstehen, wie es funktioniert.

def purify(input_list): 
    result = [] 
    for i in input_list: 
     if not i % 2: 
      result.append(i) 
    return result 
1

Die Indizes ändern sich, sobald Sie beginnen, Elemente zu entfernen. Es ist keine gute Übung, auf einer Liste zu iterieren, während Sie ihre Elemente in der Schleife mutieren. Iterate auf einem Scheibe der Liste ls[:] statt:

def purify(ls): 
    for i in ls[:]: 
     if i % 2 != 0: 
      ls.remove(i) 

Oder einfach nur eine Liste Verständnis verwenden:

[i for i in ls if i % 2 == 0] 
+0

Aber ich bin der Bearbeitung der Liste y und nicht die ursprüngliche Liste ls. Ich bin nicht in der Lage zu verstehen, warum die Funktion remove auf der y-Liste die ursprüngliche Liste ls betrifft. –

+0

Die zwei Variablen zeigen auf das gleiche Objekt. Also, wenn du 'x = y = ['a']' und dann 'x [0] = 4 'machst, wird auch' y 'aktualisiert. –

0

Der folgende Code ist viel sauberer und leichter zu verstehen:

l = [4, 5, 5, 4] 

l = filter(lambda x: x % 2 == 0, l) 

print(l) 

[4, 4]

0
remove(...) 
    L.remove(value) -- remove first occurrence of value. 
    Raises ValueError if the value is not present. 

korrekte Version:

>>> filter(lambda x: x % 2 == 0, [4, 5, 5, 4]) 
[4, 4] 

Ihre korrekte Version:

def purify(ls): 
    y = ls[:] # copy it instead of refering to it 
    for i in ls: 
     if i % 2 != 0: 
      y.remove(i) # remove will return none 

    print y 
Verwandte Themen