遍历列表部分的Pythonic方法
我想要遍历一个列表中的所有元素,但不包括前面几个,比如:
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)