Python如何检测我迭代列表中的新项目?

时间:2014-08-08 00:34:58

标签: python list for-loop iteration

如何检测到我在列表中的新项目上进行了迭代?

我知道我可以在每次循环后做变量+ = 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

换句话说,检测我何时继续进行另一次迭代

2 个答案:

答案 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代替,那个问题消失了。)


如果你想,例如,跟踪你上次到达的距离,以便下次可以从那一点开始,iterenumerate应该足以完成这一操作。但如果没有,您可以随时存储您目前已看到的索引列表,或者使列表保持[actual_value, False]对并在您看到它们时设置i[1] = True等等。是一个很大的浪费空间 - 更重要的是代码复杂性 - 除非你有充分的理由。)

答案 1 :(得分:0)

在行之间阅读,我认为你遇到的问题是你在迭代它时修改列表。这通常是不好的形式,因为未指定结果行为。

对于应该迭代列表的副本,然后在基础列表上进行的修改不会影响迭代器。

请参阅此previous answer以获得更好的策略,而不是在迭代时修改列表。我认为this article也是对这个问题的一个很好的解释。

ADDED

在一个像你这样的简单情况下,你也可以使用带整数的while循环,当你在列表中添加一个额外的项时,也可以第二次增加你的循环控制变量。