如何在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”的。使用迭代器的全部目的是避免计算整数和其他东西。当然,你的代码是有效的