【问题标题】:Python - Way to restart a for loop, similar to "continue" for while loops? [duplicate]Python - 重新启动 for 循环的方法,类似于 while 循环的“继续”? [复制]
【发布时间】:2023-03-18 21:57:01
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你问的是嵌套循环吗? while something: for ...?如果是这样,有什么这么复杂?请发布代码示例以显示您在做什么。
  • 您能否提供一些示例代码,以便我们了解您的要求。 “继续”适用于“for”和“while”循环。看起来你想要一些不同的东西。
  • continue 不会对 while 循环执行此操作,它只是跳过循环体的其余部分,就像它对 for 循环所做的那样。试着改写你的问题来描述你想要完成的事情,而不是你想要如何完成它
  • 是的,我真的很想知道你为什么要这样做。纵观全局,或许有更好的解决方案。
  • 谢谢大家。我用一个解释我正在尝试做的事情的代码示例编辑了原始帖子!

标签: python loops for-loop continue


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!第二个解决方案很棒。
  • 没问题。另请查看 Nathon 的答案,它使用forelse 子句有一个更简洁/更简单的版本。
  • 哈哈,第二个例子闻起来像 C++ 太糟糕了
【解决方案2】:
while True:
    for i in xrange(10):
        if condition(i):
            break
    else:
        break

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

【讨论】:

  • 作为澄清(因为for: ... else: 可能有点令人困惑,而且这在两个嵌套循环中也有breaks):如果条件为真,它会跳出for 循环,这意味着它跳过了该循环的else 部分,这意味着它返回到while 循环的顶部。如果条件始终为假,则完成for 循环,进入else 部分,并从while 循环进入breaks。
【解决方案3】:

重新启动整个过程的某些操作

思考算法的方式很糟糕。

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

而且——在 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'] ) )

【讨论】:

  • 他正在删除相邻的重复项,要清楚。看起来这就是您的方法所做的,但这并不是“唯一”这个名称的一般含义。
  • @David M.:虽然是真的,但这是一种“负面”评论。 “唯一不合适”。好的。你有什么建议?你能提出一些建议的“积极”评论吗?
  • 当然,如果你需要那种溺爱。 (对于它的价值,我赞成你的回答;我不是要让你失望,只是不想让 OP 感到困惑。)itertools 食谱称它为unique_justseen,也许unique_adjacent 会是更好。
  • @David M:“试图让你失望”什么?你指出了一个可能的错误。为什么不采取下一个合乎逻辑的步骤并提出建议呢?这不是“溺爱”——这是一种提供价值的方法。说某事“不是通常的意思”具有最小的价值。改进答案会增加更多价值。指出错误不会增加太多价值。我不是要求溺爱。我要求你创造尽可能多的价值。你一定有一些见识。分享吧。
  • 抱歉,我误会了您的评论。这可能是因为被人力资源人员包围。
【解决方案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'])]

【讨论】:

  • +1,不过我会返回一个生成器表达式
【解决方案5】:

Continue 适用于任何循环。

【讨论】:

【解决方案6】:

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

【讨论】:

  • 谢谢——很高兴知道!但我正在寻找一种方法来完全重新启动 for 循环...控制回到开始时的状态。
【解决方案7】:

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

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

L = ['berry','||','||','||','pancake']
idx=1
while idx<len(L):
    if L[idx-1]==L[idx]:
        del L[idx]
    else:
        idx+=1

【讨论】:

    【解决方案8】:
    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的重复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多