def purify(ls):
y = ls
for i in ls:
if i % 2 != 0:
y = y.remove(i)
print y
当我通过列表(4,5,5,4)时,以下代码失败。它返回(4,5,4)而不是(4,4)。这有什么不对?我无法理解为什么y列表中的更改会影响原始列表ls。
答案 0 :(得分:1)
这样做。
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]
在功能上。
def purify(ls):
return [i for i in ls if not i % 2]
要了解更多我扩展我的代码。从这里你可以理解它是如何工作的。
def purify(input_list):
result = []
for i in input_list:
if not i % 2:
result.append(i)
return result
答案 1 :(得分:1)
一旦开始删除项目,索引就会更改。当你在循环中改变它的项目时,迭代列表并不是一个好习惯。迭代列表ls[:]
的切片:
def purify(ls):
for i in ls[:]:
if i % 2 != 0:
ls.remove(i)
或者只使用列表理解:
[i for i in ls if i % 2 == 0]
答案 2 :(得分:0)
以下代码更清晰,更易于理解:
l = [4, 5, 5, 4]
l = filter(lambda x: x % 2 == 0, l)
print(l)
[4, 4]
答案 3 :(得分:0)
remove(...)
L.remove(value) -- remove first occurrence of value.
Raises ValueError if the value is not present.
正确的版本:
>>> filter(lambda x: x % 2 == 0, [4, 5, 5, 4])
[4, 4]
您的正确版本:
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