基本上,如果满足某个条件,我需要一种方法将控制返回到for循环的开头并实际重启整个迭代过程。
我想做的是:
for index, item in enumerate(list2):
if item == '||' and list2[index-1] == '||':
del list2[index]
*<some action that resarts the whole process>*
那样的话,如果列表中有['berry','||','||','||','pancake',我最终会说:
['berry','||','pancake']而不是。
谢谢!
答案 0 :(得分:33)
我不确定“重启”是什么意思。你想从头开始迭代,还是只是跳过当前的迭代?
如果是后者,则for
循环支持continue
,就像while
循环一样:
for i in xrange(10):
if i == 5:
continue
print i
以上将打印0到9之间的数字,除了5。
如果您正在谈论从for
循环的开头重新开始,除了“手动”之外没有办法做到这一点,例如将其包装在while
循环中:
should_restart = True
while should_restart:
should_restart = False
for i in xrange(10):
print i
if i == 5:
should_restart = True
break
以上将打印0到5之间的数字,然后再次从0开始,依此类推(这不是一个很好的例子,我知道)。
答案 1 :(得分:24)
while True:
for i in xrange(10):
if condition(i):
break
else:
break
这将做你想要的。为什么你想要这样做是另一回事。也许你应该看看你的代码,并确保你没有错过一个明显而简单的方法。
答案 2 :(得分:5)
启动整个过程的一些行动
一种思考算法的糟糕方式。
您只是过滤,即删除重复项。
并且 - 在Python中 - 你最快乐地制作副本,而不是尝试del
。一般来说,使用del
的呼声很少。
def unique( some_list ):
list_iter= iter(some_list)
prev= list_iter.next()
for item in list_iter:
if item != prev:
yield prev
prev= item
yield prev
list( unique( ['berry','||','||','||','pancake'] ) )
答案 3 :(得分:4)
不可避免的itertools版本,因为它刚刚来到我身边:
from itertools import groupby
def uniq(seq):
for key, items in groupby(seq):
yield key
print list(uniq(['berry','||','||','||','pancake'])) # ['berry','||', 'pancake']
# or simply:
print [key for key, items in groupby(['berry','||','||','||','pancake'])]
答案 4 :(得分:2)
Continue
适用于任何循环。
答案 5 :(得分:2)
continue
也适用于for循环。
>>> for i in range(3):
... print 'Before', i
... if i == 1:
... continue
... print 'After', i
...
Before 0
After 0
Before 1
# After 1 is missing
Before 2
After 2
答案 6 :(得分:1)
正如您所看到的,回答您的问题会导致一些相当复杂的代码。通常可以找到更好的方法,这就是为什么这样的结构没有内置到语言
中如果您不习惯使用itertools,请考虑使用此循环。它不仅比重新启动for循环更容易,而且效率更高,因为它不会浪费时间重新检查已经传递的项目。
L = ['berry','||','||','||','pancake']
idx=1
while idx<len(L):
if L[idx-1]==L[idx]:
del L[idx]
else:
idx+=1
答案 7 :(得分:0)
def remove_adjacent(nums):
return [a for a,b in zip(nums, nums[1:]+[not nums[-1]]) if a != b]
example = ['berry','||','||','||','pancake']
example = remove_adjacent(example)
print example
""" Output:
['berry', '||', 'pancake']
"""