如何有条件地跳过python中for循环中的迭代步骤数?

Posted

技术标签:

【中文标题】如何有条件地跳过python中for循环中的迭代步骤数?【英文标题】:How to conditionally skip number of iteration steps in a for loop in python? 【发布时间】:2014-02-05 19:21:53 【问题描述】:

我们有一个列表item_list

item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]

我们使用 for 循环遍历其项目,如果项目是 "XYZ",则跳过项目 "c", "d", "e" 并继续使用 "f"

for item in item_list:
    if item == "XYZ":
       do_something()
       skip_3_items() ----> skip items "c", "d", "e"
    else:
        do_something_else()

实现这一目标的最 Pythonic 方式是什么?

【问题讨论】:

您想跳过那些特定的项目或列表中的任何接下来的三个项目? 你可以使用计数器和 continue 直到它为 0,但我很确定最 Pythonic 的方式是完全重新考虑你的循环 @jramirez 我想跳过列表中的下 3 个项目 那么kindall的回答会为你做到这一点。 【参考方案1】:
list_iter = iter(item_list)

for item in list_iter:
    if item == "XYZ":
        do_something()
        for _ in range(3):   # skip next 3 items
            next(list_iter, None)

# etc.

基本上,不是直接迭代列表,而是为它创建一个称为 iterator 的抽象并对其进行迭代。您可以通过调用next(...) 告诉迭代器前进到下一个项目,我们会执行三次以跳过接下来的三个项目。下一次通过循环时,它会在之后的下一个项目上拾取。

【讨论】:

next(list_iter) 是做什么的? @alwbtc 它将迭代器前进一位 您应该将这些 next 语句放在 try ... except StopIteration @alwbtc 如果你是迭代器的新手,你应该read this 不要捕获 StopIteration,因为无论如何您都忽略了该值,您可以简单地使用默认 arg,例如next(list_iter, None)【参考方案2】:

由于没有人提到过while循环,我会:

item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]
i = 0
while i < len(item_list):
    item = item_list[i]
    if item == "XYZ":
        do_something()
        i += 3
    else:
        do_something_else()
    i += 1

【讨论】:

我相信没有人提到过,因为使用 while 通常非常“非 Pythonic”。使用迭代器的全部意义在于避免计算整数和其他东西。你的代码当然可以工作【参考方案3】:

使用迭代器:

$ cat t.py 
item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]

it = iter(item_list)
for item in it:
    if item == "XYZ":
       print item
       for _ in range(3):
           next(it, None)
    else:
        print item

这给出:

$ python t.py 
a
b
XYZ
f
g

【讨论】:

【参考方案4】:

为了便于阅读,我将把它分成两部分处理

>>> def foo(item_list,key = "XYZ", skip = 3):
    from itertools import takewhile, islice
    def do_something():
        return "do_something()"
    def do_something_else():
        return "do_something_else()"
    it = iter(item_list)
    for items in takewhile(lambda e: e != key, it):
        print items, do_something_else()
    print do_something()
    it = islice(it,skip, None)
    for items in it:
        print items, do_something_else()


>>> foo(item_list)
a do_something_else()
b do_something_else()
do_something()
f do_something_else()
g do_something_else()

【讨论】:

【参考方案5】:

我会存储一个处理跳过项目的计数器。

def skipper(item_list):
    skip_count = 0
    for item in item_list:
        if item == "XYZ":
            skip_count = 3
        else:
            if skip_count:
                skip_count -= 1
            else:
                # do_something()
                print item,

例子:

In [23]: item_list
Out[23]: ['a', 'b', 'XYZ', 'c', 'd', 'e', 'f', 'g']

In [24]: skipper(item_list)
a b f g

【讨论】:

【参考方案6】:

我个人可能会这样写:

xyz_i = item_list.index('XYZ')

do_something('XYZ') #or do_something(item_list[xyz_i]) but.. just save yourself the list lookup

for x in item_list[xyz_i+4:]:
    do_something_else(x)

【讨论】:

以上是关于如何有条件地跳过python中for循环中的迭代步骤数?的主要内容,如果未能解决你的问题,请参考以下文章

字符串长度的for循环奇怪地跳过了一些字符

如何有条件地跳过 Grails Spring Security 插件过滤器链中的 SecurityContextPersistenceFilter 过滤器

Python:如果条件为真,则跳过 For 循环中的迭代

有条件地跳过案例

我可以有条件地跳过在同一个文件中加载“更多”红宝石代码吗?

跳过 for 循环中的第一个值