如何在python中有条件地跳过for循环中的迭代步骤数?
我们有一个清单如何在python中有条件地跳过for循环中的迭代步骤数?,python,list,for-loop,Python,List,For Loop,我们有一个清单项目清单 item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"] 我们使用for循环迭代其项,如果项是“XYZ”,则跳过项“c”、“d”、“e”,然后继续执行“f”: 实现这一目标的最有可能的方法是什么 list_iter = iter(item_list) for item in list_iter: if item == "XYZ": do_something() for _ in
项目清单
item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]
我们使用for循环迭代其项,如果项是“XYZ”
,则跳过项“c”、“d”、“e”
,然后继续执行“f”
:
实现这一目标的最有可能的方法是什么
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.
基本上,不是直接迭代列表,而是为它创建一个称为迭代器的抽象,并对其进行迭代。您可以通过调用next(…)
来告诉迭代器前进到下一项,我们会做三次这样的操作来跳过下三项。下一次通过循环时,它会在之后的下一个项目中拾取
基本上,不是直接迭代列表,而是为它创建一个称为迭代器的抽象,并对其进行迭代。您可以通过调用
next(…)
来告诉迭代器前进到下一项,我们会做三次这样的操作来跳过下三项。下一次通过循环时,它会在之后的下一个项目中拾取。我会存储一个计数器来处理跳过的项目
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
我会存储一个处理跳过项目的计数器
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
使用迭代器:
$ 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
使用迭代器:
$ 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
我个人可能会这样写:
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)
我个人可能会这样写:
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)
由于没有人提到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
item_list=[“a”、“b”、“XYZ”、“c”、“d”、“e”、“f”、“g”]
i=0
当i
既然没有人提到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
item_list=[“a”、“b”、“XYZ”、“c”、“d”、“e”、“f”、“g”]
i=0
当i
为了可读性,我会将处理过程分成两部分
>>> 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()
为了可读性,我会将处理过程分成两部分
>>> 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()
是否要跳过这些特定项目或列表中的任何后续三个项目?可以使用计数器并
继续,直到它为0,但我很确定最具蟒蛇风格的方式是重新思考你的循环entirely@jramirez我想跳过列表中的下3项然后kindall的答案可以帮你。你想跳过这些特定项或列表中的任何下3项吗?你可以使用计数器并继续,直到它为0,但我很确定最具蟒蛇风格的方式是重新思考你的循环entirely@jramirez我想跳过列表中的下3项,然后kindall的答案会帮你。下一步(列表)做什么?@alwbtc它将迭代器向前推进一个位置你应该把那些next
语句放在中试试。。。除了StopIteration之外
@alwbtc如果你是迭代器新手,你不应该捕捉StopIteration,因为你忽略了这个值,你可以简单地使用默认的参数,例如next(list\u iter,None)
接下来做什么(list\iter)do?@alwbtc它将迭代器向前推进一个位置您应该将那些下一个语句放入try。。。除了StopIteration
@alwbtc如果你是迭代器新手,你应该不要捕捉StopIteration,因为你忽略了这个值,你可以简单地使用默认的参数,例如next(list_iter,None)
我相信没有人提到过,因为它通常是非常“非pythonic”的。使用迭代器的全部目的是避免计算整数和其他东西。当然,你的代码是有效的,我相信没有人提到过,因为它通常是非常“非Python”的。使用迭代器的全部目的是避免计算整数和其他东西。当然,你的代码是有效的