如何在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 个回答
8
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,就能达到同样的效果。
8
这个方法简洁、符合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
# ...
50
试试这个:
lines = iter(open('something.txt', 'r'))
for val in lines:
if val == "!":
lines.next()
continue
<etc>
你可能需要在某个地方捕捉一下 StopIteration
。这个情况会发生在迭代器已经结束的时候。