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

Python如何检测我在列表中的新项上进行了迭代?,python,list,for-loop,iteration,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 every

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

我知道我可以在每次循环后计算变量+=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
>>> for index, value in enumerate(['a', 'b', 'c']):
...     print(index, value)
0 a
1 b
2 c

换句话说,当我开始另一个迭代时,首先检测,为了避免自己跟踪计数,您可以使用
枚举

for index, value in enumerate(seq):
现在,您将始终知道哪个索引与当前的
值相匹配。例如:

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
>>> for index, value in enumerate(['a', 'b', 'c']):
...     print(index, value)
0 a
1 b
2 c

另一种方法是创建迭代器,然后在其上循环:

it = iter(seq)
for value in it:
现在,原始序列仍将包含所有值,但
它将只包含您尚未查看的值

或者,如果您愿意,您可以手动在其上调用
next
,以便在某个点停止,或者使用类似
itertools.takewhile
的函数为您执行此操作,或者


如果您根本不想保留这些值,可以破坏性地修改序列:

while True:
    try:
        value = seq.pop(0)
    except IndexError:
        break
(请注意,对于较大的列表,此选项可能会比较慢,因为弹出开头会使整个列表向上移动。如果可以从末尾而不是从开头弹出,或者使用
deque
来代替,则该问题会消失。)



例如,如果你想记录你上次走了多远,以便下次可以从那一点开始学习,那么
iter
enumerate
就足够了。但是如果没有,您可以存储一个到目前为止看到的索引列表,或者让列表保留
[actual_value,False]
对,并在看到它们时设置
i[1]=True
,等等(这将是一个巨大的空间浪费,更重要的是,除非您有充分的理由这么做,否则代码复杂度会很高)。

首先,为了避免自己记录计数,您可以使用
枚举

for index, value in enumerate(seq):
现在,您将始终知道哪个索引与当前的
值相匹配。例如:

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
>>> for index, value in enumerate(['a', 'b', 'c']):
...     print(index, value)
0 a
1 b
2 c

另一种方法是创建迭代器,然后在其上循环:

it = iter(seq)
for value in it:
现在,原始序列仍将包含所有值,但
它将只包含您尚未查看的值

或者,如果您愿意,您可以手动在其上调用
next
,以便在某个点停止,或者使用类似
itertools.takewhile
的函数为您执行此操作,或者


如果您根本不想保留这些值,可以破坏性地修改序列:

while True:
    try:
        value = seq.pop(0)
    except IndexError:
        break
(请注意,对于较大的列表,此选项可能会比较慢,因为弹出开头会使整个列表向上移动。如果可以从末尾而不是从开头弹出,或者使用
deque
来代替,则该问题会消失。)



例如,如果你想记录你上次走了多远,以便下次可以从那一点开始学习,那么
iter
enumerate
就足够了。但如果没有,您可以始终存储一个到目前为止看到的索引列表,或者让列表保留
[实际值,False]
对,并在看到它们时设置
i[1]=True
,等等(这将是一个巨大的空间浪费,更重要的是,除非您有充分的理由这么做,否则代码复杂度会很高)。

,我认为您遇到的问题是,您在遍历列表时正在修改列表。这通常是不好的形式,因为没有指定结果行为

For应该在列表的副本上迭代,然后对基础列表所做的修改不会影响迭代器

请参阅此内容,了解比在迭代列表时修改列表更好的策略。我认为这也是问题的一个很好的解释

增加


在一个简单的例子中,您也可以使用一个带整数的while循环,当您向列表中添加一个额外的项时,也可以第二次增加循环控制变量。

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

For应该在列表的副本上迭代,然后对基础列表所做的修改不会影响迭代器

请参阅此内容,了解比在迭代列表时修改列表更好的策略。我认为这也是问题的一个很好的解释

增加


在一个简单的例子中,您也可以使用带有整数的while循环,当您向列表中添加额外的项时,也可以第二次增加循环控制变量。

如果是一个小列表,您可以使用
pop()
。但是,当您使用
for
循环时,您基本上会迭代每个元素。也许你可以把你的问题扩大一点你所说的“迭代一个新项目”是什么意思?您是否试图检测上次循环时列表中没有的项目?或者,您是否正在尝试检测是否已进入下一个循环迭代?因为你可以通过你在代码中的位置来判断你已经进入了下一个迭代。我不确定这里的问题是什么。。。你能详细说明一下吗?对lst中的i执行
操作将只生成每个项目一次,除非您的列表包含对同一项目的多个引用。这就是你想要避免的吗?@user2357112检测到我已进入下一个循环迭代。编辑的版本仍然没有帮助。每次输入
for
循环时,您都会移动到一个新位置。如果是一个小列表,您可以使用
pop()
。但是,当您使用
for
循环时,您基本上会迭代每个元素。也许你可以把你的问题扩大一点你所说的“迭代一个新项目”是什么意思?您是否试图检测上次循环时列表中没有的项目?或者,您是否正在尝试检测是否已进入下一个循环迭代?因为你可以打电话