我想更新这样的列表,
_list=[i for i in range(1, 6)]
for i in _list:
_list = [j for j in _list if j**2 < 25]
print(len(_list), i)
但是循环运行5次,即使每次执行循环时列表的长度显示为4。 for语句中的list变量是否与循环内的变量不同,如果是,我该如何更新它?
编辑:对于那些已经回答到目前为止的人,我的问题似乎已经不清楚了,或许,对我的负面评价。我的代码运行更多,
_list = [i for i in range(3, 5000, 2)]
_list.append(2)
for i in _list:
_list = [x for x in _list if x%i != 0 or x==i]
print(len(_list), i)
所以我不认为我可以使用if语句或过滤器函数,据我所知。这只是一个筛子,我希望它以这种方式运行。我希望循环的执行次数只有所需数量而不是更多。
答案 0 :(得分:0)
因为你在循环中有一个列表理解,而python在第一个循环中计算你的欲望列表,所以列表的长度是4
而不是你可以使用下面的代码:
>>> l=[]
>>> for i in _list:
... if i**2 < 25:
... l.append(i)
... print(len(l), i)
...
(1, 1)
(2, 2)
(3, 3)
(4, 4)
>>> l
[1, 2, 3, 4]
答案 1 :(得分:0)
你可以这样做:
l = range(1, 6)
l = filter(lambda x: x**2 < 25, _list)
print(_list) # this will print [1, 2, 3, 4]
答案 2 :(得分:0)
_list=[i for i in range(1, 6)] # Line 1
for i in _list: # Line 2
_list = [j for j in _list if j**2 < 25] # Line 3
print(len(_list), i) #Line 4
在第1行中_list被初始化。较短的方法可能是范围(1,6),不知道为什么你选择列表理解。
在第2行_list值为[1,2,3,4,5]。所以现在你准备好迭代5次了。 但是你再次更改_list,第一次迭代中的值为[1,2,3,4],在第3行。所以现在循环将运行4次,从第二次Itertion for for循环开始2。
答案 3 :(得分:0)
更好的方法是使用filter()函数。可以这样做:
num_list = range(1, 6)
my_list = filter(lambda x: x**2 < 25, num_list)
my_list
列表将包含来自num_list
的数字,其中square小于25.
答案 4 :(得分:0)
for语句中的列表变量实际上与循环内部的变量不同。这可以验证为:
>>> _list = range(1,6)
>>> _list
[1, 2, 3, 4, 5]
>>> id(_list)
140281026550312 # original id
>>> _list = range(1,5) # reinitialize
>>> _list
[1, 2, 3, 4]
>>> id(_list)
140281028978376 # id changed
正如您所看到的,重新初始化列表并不会修改原始列表,因为在重新初始化id
更改后您可以看到_list
,这意味着原始列表保持不变。现在,修改原始列表的替代方法是pop()
操作,可以用作:
>>> _list = [i for i in range(1, 6)]
>>> for i in _list:
... popped = [_list.pop(j) for j in range(len(_list)) if not _list[j]**2 < 25]
... print(len(_list), i)
...
1 1
1 2
1 3
1 4
修改下面给出的第二个代码以获得正确的输出:
_list = [i for i in range(3, 5000, 2)]
_list.append(2)
for i in _list:
popped = [_list.pop(j) for j,x in enumerate(_list) if x%i==0 and x!=i]
# above list compression means remove all list items that are divisible by i and not equal to i
print(len(_list), i)
popped
是一个虚拟变量,从未使用过。它存在,因为pop()
操作返回弹出值,应该收集它们,如果在解释器模式下工作,它们将被不必要地打印。