使用for循环更新列表

时间:2014-12-24 08:39:45

标签: python for-loop

我想更新这样的列表,

_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语句或过滤器函数,据我所知。这只是一个筛子,我希望它以这种方式运行。我希望循环的执行次数只有所需数量而不是更多。

5 个答案:

答案 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()操作返回弹出值,应该收集它们,如果在解释器模式下工作,它们将被不必要地打印。