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

2024-04-28 23:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个非常愚蠢的问题,但是我在网上到处找过,没有看到一个可靠的答案。

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

lines = open('something.txt', 'r').readlines()
for line in lines:
    if line == '!':
        # force iteration forward twice
        line.next().next()
    <etc>
<>很容易在C++中完成;只是增加迭代器一个额外的时间。在Python中有一种简单的方法可以做到这一点吗?

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


Tags: 方法答案intxtforiflineopen
3条回答

尝试:

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

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

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

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指出的那样,file对象本身充当一个迭代器,因此您可以通过不调用readlines和不调用iter来获得相同的效果。

相关问题 更多 >