遍历列表部分的Pythonic方法

66 投票
8 回答
78957 浏览
提问于 2025-04-17 09:13

我想要遍历一个列表中的所有元素,但不包括前面几个,比如:

for line in lines[2:]:
    foo(line)

这个方法很简洁,但会把整个列表复制一遍,这其实没必要。我可以这样做:

del lines[0:2]
for line in lines:
    foo(line)

但是这样会修改原来的列表,这并不总是好的。

我可以这样做:

for i in xrange(2, len(lines)):
    line = lines[i]
    foo(line)

不过,这样看起来就不太好。

更好的方法可能是这样:

for i,line in enumerate(lines):
    if i < 2: continue
    foo(line)

但是这个方法没有第一个例子那么明显。

所以,有没有一种方法,既能像第一个例子那样简单明了,又不需要不必要地复制列表呢?

8 个回答

12

虽然 itertools.islice 看起来是解决这个问题的最佳方法,但我觉得为了这么简单的事情多引入一个库似乎有点多余。

就我个人而言,我觉得 enumerate 的解决方案既清晰又简洁——不过我更喜欢这样写:

for index, line in enumerate(lines):
    if index >= 2:
        foo(line)
28

原来的解决方案在大多数情况下都是合适的。

for line in lines[2:]:
    foo(line)

虽然这样可以复制列表,但这只是一个浅复制,速度也很快。在你没有分析代码并发现这个地方是瓶颈之前,不用担心优化。

51

你可以试试 itertools.islice(iterable[, start], stop[, step]) 这个功能:

import itertools
for line in itertools.islice(lines, start, stop):
     foo(line)

撰写回答