如何跳过Python循环中的当前项和下一项?

如何跳过Python循环中的当前项和下一项?,python,Python,这可能是一个非常愚蠢的问题,但我已经在网上查看了一下,并没有看到一个可靠的答案 有没有一个简单的方法来做这样的事情 lines = open('something.txt', 'r').readlines() for line in lines: if line == '!': # force iteration forward twice line.next().next() <etc> lines=open('something.

这可能是一个非常愚蠢的问题,但我已经在网上查看了一下,并没有看到一个可靠的答案

有没有一个简单的方法来做这样的事情

lines = open('something.txt', 'r').readlines()
for line in lines:
    if line == '!':
        # force iteration forward twice
        line.next().next()
    <etc>
lines=open('something.txt','r')。readlines()
对于行中的行:
如果行=='!':
#强制迭代前进两次
line.next().next()
在C++中很容易做到;只需额外增加迭代器的时间。在Python中有没有一种简单的方法可以做到这一点

我只想指出,这个问题的主要目的不是“阅读文件之类”和跳过东西。我更希望寻找C++迭代器风格的迭代。另外,新标题有点傻,我真的不认为它反映了我问题的本质。

不太紧凑:

skip = False
for line in open('something.txt'):
  if skip:
    skip = False
    continue

  if line.strip() == '!':
    skip = True
    continue

可以使用递归

input = iter( open('something.txt') )
def myFunc( item ):
    val = iter.next()
    if( val == '!' ):
        item.next()
        return myFunc( item )
    #continue on with looping logic
编辑的帖子包含以下事实上没有回答你的问题:

你试过了吗

[line for line in open('something.txt') if line != '!']
制作一份新的清单?甚至更好

filter( lambda line: line != '!', open('something.txt') )
尝试:

lines=iter(open('something.txt','r'))
对于行中的val:
如果val==“!”:
行。下一行()
持续

您可能想在某个地方捕获
StopIteration
。如果迭代器完成,就会发生这种情况。

file.readlines方法返回一个字符串列表,在列表上迭代将不允许修改循环体中的迭代。但是,如果您首先在列表中调用iter,那么您将得到一个迭代器,您可以在循环体中修改它:

lines = open('something.txt', 'r').readlines()
line_iter = iter(lines)
for line in line_iter:
    if line == '!':
        # force iteration forward twice
        line_iter.next()
        line_iter.next()
    <etc>
lines=open('something.txt','r')。readlines()
国际热核实验堆线=国际热核实验堆(线)
对于串联iter:
如果行=='!':
#强制迭代前进两次
下一行()
下一行()

正如ebo指出的那样,文件对象本身起到迭代器的作用,因此您可以通过不调用readlines而忽略对iter的调用来获得相同的效果。

这是一个简短的、python式的、有效的方法:

with open('something.txt', 'r') as f: # or simply f = open('something.txt', 'r')
    nobang = (line for line in f if line != '!\n')
    for line in nobang:
        #...
编辑:

正如许多人所观察到的,这还不是解决办法。我能想到的最好方法是将本页已有内容结合起来:

with open('something.txt', 'r') as f:
    for line in f:
        if line == '!\n':
            next(f,None) # consume next line
            continue # skip this line
        # ...

为什么不使用生成器表达式而不是列表?只需将
[
]
替换为
,它仍然可以使用,但如果文件很大,它不会复制重要列表。递归版本将在超过1000行的文件上中断(取决于Python实现)。除非使用邪恶的蹦床:哇,那是邪恶的,我需要玩弄它。谢谢。@down投票人:这个答案确实解决了这个问题。。。您介意解释一下吗?稍微有点夸张,但是您不需要调用
readlines()
,除非您确实想将整个文件存储在一个行列表中
open()。(需要Python 2.6)有双向迭代的机会吗?没有默认迭代器。但是,您可以通过重写正确的函数来创建自己的迭代器样式类。此解决方案不如带有
with
语句的解决方案干净,因为您确实应该清理文件并关闭它。你可以用
免费获得这个。这不会跳过下一行。@Dingle:不,只有2.6或更高版本。这是迄今为止最优雅的一款,+1@莫洛克:除了它没有达到原始海报的要求——也就是说,它没有跳过有“!”的那一行后面的那一行。您可以在Python3.x以及Python2.5和更高版本中使用它。如上所述,它在2.6+中默认为启用,但对于2.5.x,您需要发出
from\uuuuu future\uuuuu import with_语句
line将永远不等于
!”除非首先从结尾处去除换行符。
with open('something.txt', 'r') as f:
    for line in f:
        if line == '!\n':
            next(f,None) # consume next line
            continue # skip this line
        # ...