15

基本上,我需要一种方法将控制权返回到 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'] 代替。

谢谢!

4

8 回答 8

42

我不确定您所说的“重新启动”是什么意思。您想从头开始迭代,还是直接跳过当前迭代?

如果是后者,那么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 重新开始,以此类推(我知道,这不是一个很好的例子)。

于 2010-09-13T22:44:17.087 回答
25
while True:
    for i in xrange(10):
        if condition(i):
            break
    else:
        break

这将做你似乎想要的。为什么要这样做是另一回事。也许您应该看一下您的代码,并确保您没有错过一种明显且更简单的方法。

于 2010-09-13T22:44:56.393 回答
5

一些重新启动整个过程的动作

思考算法的糟糕方式。

您只是在过滤,即删除重复项。

而且——在 Python 中——你最高兴的是制作副本,而不是尝试做del. 一般来说,很少有人调用 use 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'] ) )
于 2010-09-13T22:56:44.503 回答
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'])]
于 2010-09-13T23:26:07.473 回答
3

Continue适用于任何循环。

于 2010-09-13T22:37:48.017 回答
3

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
于 2010-09-13T22:39:05.280 回答
1

如您所见,回答您的问题会导致一些相当复杂的代码。通常可以找到更好的方法,这就是为什么这种结构没有内置到语言中的原因

如果您不习惯使用 itertools,请考虑改用此循环。不仅比重新启动 for 循环更容易遵循,而且效率更高,因为它不会浪费时间重新检查已经通过的项目。

L = ['berry','||','||','||','pancake']
idx=1
while idx<len(L):
    if L[idx-1]==L[idx]:
        del L[idx]
    else:
        idx+=1
于 2010-09-13T23:45:07.490 回答
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']
"""

顺便说一句,这是从列表中删除相邻重复元素的重复

于 2010-09-13T23:32:55.747 回答