Python - 重启for循环的方法,类似于while循环的“continue”?

时间:2010-09-13 22:34:43

标签: python loops for-loop continue

基本上,如果满足某个条件,我需要一种方法将控制返回到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']而不是。

谢谢!

8 个答案:

答案 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']
"""

顺便说一下,重复Remove adjacent duplicate elements from a list