我正在尝试创建一个列表,该列表接收数字并删除列表中的所有旧数字并返回结果,但它一直给我错误"本地变量'&#39 ;在转让前引用"我该如何解决?
def purify(lst):
for item in lst:
if item%2 != 0:
lst.remove(item)
s.append(lst)
s = []
return s
答案 0 :(得分:1)
您需要先将s分配给空列表然后追加。
def purify(lst):
for item in lst:
if item%2 != 0:
lst.remove(item)
s = []
s.append(lst)
return s
正如@jonrsharpe建议的那样,在迭代列表时不要删除该项目。好的方法是使用列表理解:
[i for i in lst if i%2!=0]
答案 1 :(得分:1)
目前尚不清楚为什么要返回包含单个列表的列表。为什么不返回“纯化”清单?
def purify(lst):
return [item for item in lst if item % 2 == 0]
这使用list comprehension。演示:
>>> purify([1, 2, 3, 4, 5])
[2, 4]
为了获得更大的灵活性,您还可以制作一个传递自己规则的版本:
def purify(lst, rule):
return [item for item in lst if rule(item)]
演示:
>>> purify([1, 2, 3, 4, 5], lambda i: i % 2)
[1, 3, 5]
答案 2 :(得分:0)
迭代时不应删除项目,因为在使用迭代器时不应更改列表(这是您使用“in”执行的操作)。
def purify(lst):
s = []
for item in lst:
if item%2 == 0:
s += [item]
return s
btw:这可以用numpy快速完成。
import numpy as np
...
def purify(lst):
indices = np.where(np.mod(lst,2) == 0)
return np.array(lst)[indices]
答案 3 :(得分:0)
使用过滤器简化您的生活:
filter(lambda x: x % 2 == 0, range(5))