Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跳过枚举列表对象(python)中的迭代_Python_Loops_Skip - Fatal编程技术网

跳过枚举列表对象(python)中的迭代

跳过枚举列表对象(python)中的迭代,python,loops,skip,Python,Loops,Skip,我有密码 for iline, line in enumerate(lines): ... if <condition>: <skip 5 iterations> 对于iline,枚举中的行(行): ... 如果: 如您所知,如果满足条件,我希望for循环跳过5次迭代。我可以确定,如果满足条件,则“lines”对象中还剩下5个或更多对象 存在字典数组的行,这些行必须按顺序循环 iline = 0 while iline < len

我有密码

for iline, line in enumerate(lines):
    ...
    if <condition>:
        <skip 5 iterations>
对于iline,枚举中的行(行):
...
如果:
如您所知,如果满足条件,我希望for循环跳过5次迭代。我可以确定,如果满足条件,则“lines”对象中还剩下5个或更多对象

存在字典数组的行,这些行必须按顺序循环

iline = 0
while iline < len(lines):
    line = lines[iline]
    if <condition>:
        place_where_skip_happened = iline
        iline += 5
    iline += 1
这实际上取决于您迭代的内容和您想要做的事情

使用您自己的代码和:

从itertools导入islice
it=国际热核实验堆(列举(行))
对于iline,其中的行:
如果:
发生跳过的位置=直线
下一个(islice(it,5,5),无)
打印(行)

正如Padraic Cunningham所说,您可以通过while循环来实现这一点,也可以使用字典来替换if语句:

iline = 0
skip = {True:5, False:1}

while iline > len(lines):
    line = lines[iline]
    ...
    iline += skip[condition]

执行此操作的标准习惯用法是生成一个迭代器,然后使用一个使用者模式(请参见
itertools
文档中的)

例如:

from itertools import islice

lines = list("abcdefghij")

lit = iter(enumerate(lines))
for iline, line in lit:
    print(iline, line)
    if line == "c":
        # skip 3
        next(islice(lit, 3,3), None)
产生

0 a
1 b
2 c
6 g
7 h
8 i
9 j

使用外部标志,在满足条件时设置,并在循环开始时检查:

ignore = 0
for iline, line in enumerate(lines):
    if ignore > 0:
        ignore -= 1
        continue

    print(iline, line)

    if iline == 5:
        ignore = 5
或从枚举中显式提取5个元素:

enum_lines = enumerate(lines)
for iline, line in enum_lines:
    print(iline, line)

    if iline == 5:
        for _, _ in zip(range(5), enum_lines):
            pass

我个人更喜欢第一种方法,但第二种方法看起来更像python。

您可以使用带有递归的函数式编程风格,首先将
for
循环的必要部分放入函数中:

def my_function(iline, line, rest_of_lines, **other_args):
    do_some_side_effects(iline, line, **other_args)

    if rest_of_lines == []:
        return <some base case>

    increment = 5 if <condition> else 1
    return my_function(iline+increment, 
                       rest_of_lines[increment-1], 
                       rest_of_lines[increment:],
                       **other_args)
如果您需要函数为每个索引返回不同的内容,那么我建议稍微修改一下,以考虑您想要的输出数据结构。在这种情况下,您可能希望将
do_some_side_effects
的内部结果传递回递归函数调用,以便它可以建立结果

def my_function(iline, line, rest_of_lines, output, **other_args):
    some_value = do_some_side_effects(iline, line, **other_args)

    new_output = put_value_in_output(some_value, output)
    # could be as simple as appending to a list/inserting to a dict
    # or as complicated as you want.

    if rest_of_lines == []:
        return new_output

    increment = 5 if <condition> else 1
    return my_function(iline+increment, 
                       rest_of_lines[increment-1], 
                       rest_of_lines[increment:],
                       new_output,
                       **other_args)
请注意,在Python中,由于大多数基本数据结构的实现方式,这种编程风格不会提高您的效率,在其他面向对象代码的上下文中,除了简单的
解决方案之外,将事情复杂化甚至可能是不好的风格

我的建议是:使用
while
循环,尽管我倾向于构建我的项目和API,以便使用递归函数方法仍然是高效和可读的。我也会尽量避免在循环中产生副作用。

使用枚举索引 与公认的答案类似…除了不使用
itertools
(IMHO
islice
不会提高可读性),加上
enumerate()
已经返回迭代器,因此您根本不需要
iter()

lines = [{str(x): x} for x in range(20)]  # dummy data

it = enumerate(lines)
for i, line in it:
    print(line)

    if i == 10:  # condition using enumeration index
        [next(it, None) for _ in range(5)]  # skip 5
最后一行可以选择性地展开以提高可读性:

        for _ in range(5):  # skip 5
            next(it, None)
        for _ in range(5):  # skip 5
            lines.pop(0)
如果没有足够的项目可以跳过,则
next()
中的
None
参数可以避免异常。(对于原始问题,可以省略,因为OP写道:“我可以确定,如果满足条件,
对象中还有5个或更多对象。”)

不使用枚举索引 如果跳过条件不基于枚举索引,只需将列表视为FIFO队列,并使用
pop()


(对于大型列表,请使用
collections.deque
来提高性能。)

而在这种情况下,我认为
循环可以更有效。我需要我的其余代码中的迭代次数,那么我该如何在一段时间内完成?使用
continue
命令将循环移动到下一个iterable@kilojoules,只会跳过一行这真的是最漂亮的代码吗?必须在循环的末尾添加iline+=1吗?@pidgey这有什么不对?为什么它需要被糖化成一些成语呢?这很简短,切中要害,从代码中可以清楚地看出目的是什么。一点问题也没有。正如我在问题中提出的,一份dictionaries@PadraicCunningham:但是接下来的(行)不会在enumerate()上工作,或者会吗?@pidgey,如果你像我对range那样调用iter,它会工作。您还可以在迭代器上调用
itertools.islice
,跳过这些行
other_args = get_other_args(...)

empty_output = get_initial_data_structure(...)

full_output = my_function(0, lines[0], lines[1:], empty_output, **other_args)
lines = [{str(x): x} for x in range(20)]  # dummy data

it = enumerate(lines)
for i, line in it:
    print(line)

    if i == 10:  # condition using enumeration index
        [next(it, None) for _ in range(5)]  # skip 5
        for _ in range(5):  # skip 5
            next(it, None)
lines = [{str(x): x} for x in range(20)]  # dummy data

while lines:
    line = lines.pop(0)  # get first item
    print(line)

    if <condition>:  # some other kind of condition
        [lines.pop(0) for _ in range(5)]  # skip 5
        for _ in range(5):  # skip 5
            lines.pop(0)