2010-04-07 113 views
17

这可能是一个非常愚蠢的问题,但我已经环顾四周等等,并没有看到一个确凿的答案。如何在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

略OT,但你并不需要调用'readlines方法()',除非你真的想保存整个文件中行列表。 open()已经返回一个迭代器来访问各个行。 – 2010-04-07 13:45:23

+0

我不知道。谢谢 – UberJumper 2010-04-07 14:22:33

+0

yup,除非你使用2.2以前的Python,否则这是真实的:P – wescpy 2010-04-07 21:58:37

回答

25

尝试:

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

你可能想赶上StopIteration地方。如果迭代器完成,就会发生。

+5

您可以使用'next(lines,None)'来抑制'StopIteration'异常。 (需要Python 2.6) – interjay 2010-04-07 13:48:56

+0

任何双向迭代的机会? – UberJumper 2010-04-07 14:28:39

+1

不适用于默认迭代器。然而,你可以通过覆盖正确的函数来创建自己的迭代器样式类。 – ebo 2010-04-07 14:35:59

1

不是很紧凑:

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

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

行永远不会等于“!”,除非你从头开始剥离换行符。 – tgray 2010-04-07 15:51:52

+0

通过添加.strip() – Harriv 2010-04-07 21:02:16

0

你可以使用递归

input = iter(open('something.txt')) 
def myFunc(item): 
    val = iter.next() 
    if(val == '!'): 
     item.next() 
     return myFunc(item) 
    #continue on with looping logic 

Editted后包含这实际上并没有回答你的问题如下:

你试过

[line for line in open('something.txt') if line != '!'] 

产生一个新的列表?甚至更好

filter(lambda line: line != '!', open('something.txt')) 
+0

修复为什么不使用生成器表达式而不是列表理解?只需用'('和')'替换'['和']',它仍然是可迭代的,但不会重复列表 - 如果文件很大,这个列表很重要。 – 2010-04-07 13:44:52

+1

递归版本将在具有超过1000行的文件中断开(Python实现相关)。 – ebo 2010-04-07 13:45:11

+1

除非使用邪恶的蹦床:http://aspn.activestate.com/ASPN/Mail/Message/python-tutor/2302231 – 2010-04-07 13:47:52

5

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来实现。

9

这是短暂的,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 
     # ... 
+0

这是p3k语法,对不对? – Dingle 2010-04-07 14:11:17

+3

这不会跳过下一行。 – interjay 2010-04-07 14:12:57

+0

@Dingle:不,只有2.6或更高版本。 – 2010-04-07 14:29:01

相关问题