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

时间:2010-04-07 13:31:53

标签: python

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

有没有一种简单的方法可以做这样的事情?

lines = open('something.txt', 'r').readlines()
for line in lines:
    if line == '!':
        # force iteration forward twice
        line.next().next()
    <etc>

在C ++中很容易做到;只需将迭代器增加一个额外的时间。在Python中有一种简单的方法吗?

我只想指出,这个问题的主要目的不是“阅读文件等”和跳过事情。我更喜欢C ++迭代器样式迭代。新标题也有点愚蠢,我真的不认为它反映了我问题的本质。

5 个答案:

答案 0 :(得分:33)

尝试:

lines = iter(open('something.txt', 'r'))
for val in lines:
    if val == "!":
        lines.next()
        continue
    <etc>

您可能希望在某处抓住StopIteration。如果迭代器完成就会发生。

答案 1 :(得分:9)

这是短暂的,pythonic,并且有效:

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
        # ...

答案 2 :(得分:7)

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>

正如ebo指出的那样,文件对象本身就是一个迭代器,所以你可以通过不调用readlines并省去对iter的调用来获得相同的效果。

答案 3 :(得分:1)

不太紧凑:

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

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

答案 4 :(得分:1)

你可以使用递归

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') )