如何检测到我在列表中的新项目上进行了迭代?
我知道我可以在每次循环后做变量+ = 1,但我不想这样做。如果必须,我会这样做。
我想要类似的东西:
for i in list:
if i.iterated:
...
但当然不会有效。
例如:
list = ['h', 'e', 'l', 'l', 'o']
for i in list:
pass # I want to add a space (' ') between 'h' and 'e', and join everything after it
换句话说,检测我何时继续进行另一次迭代
答案 0 :(得分:4)
首先,为了避免自己跟踪计数,您可以使用enumerate
:
for index, value in enumerate(seq):
现在,您始终知道哪个索引符合当前value
。例如:
>>> for index, value in enumerate(['a', 'b', 'c']):
... print(index, value)
0 a
1 b
2 c
另一种方法是创建一个迭代器,然后循环遍历:
it = iter(seq)
for value in it:
现在,原始序列仍会包含所有值,但it
只会显示您尚未查看过的值。
或者,如果您愿意,可以手动拨打next
,这样您就可以停在某个位置,或者使用像itertools.takewhile
这样的功能为您做到这一点,或者......
如果您不想保留这些值,可以破坏性地修改序列:
while True:
try:
value = seq.pop(0)
except IndexError:
break
(请注意,对于大型列表,这可能会很慢,因为弹出开头必须将整个列表向上移动。如果您可以从末尾而不是从头开始弹出,或者使用deque
代替,那个问题消失了。)
如果你想,例如,跟踪你上次到达的距离,以便下次可以从那一点开始,iter
或enumerate
应该足以完成这一操作。但如果没有,您可以随时存储您目前已看到的索引列表,或者使列表保持[actual_value, False]
对并在您看到它们时设置i[1] = True
等等。是一个很大的浪费空间 - 更重要的是代码复杂性 - 除非你有充分的理由。)
答案 1 :(得分:0)
在行之间阅读,我认为你遇到的问题是你在迭代它时修改列表。这通常是不好的形式,因为未指定结果行为。
对于应该迭代列表的副本,然后在基础列表上进行的修改不会影响迭代器。
请参阅此previous answer以获得更好的策略,而不是在迭代时修改列表。我认为this article也是对这个问题的一个很好的解释。
ADDED
在一个像你这样的简单情况下,你也可以使用带整数的while循环,当你在列表中添加一个额外的项时,也可以第二次增加你的循环控制变量。