如何有条件地跳过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循环中的迭代步骤数?的主要内容,如果未能解决你的问题,请参考以下文章
如何有条件地跳过 Grails Spring Security 插件过滤器链中的 SecurityContextPersistenceFilter 过滤器