Cla*_*diu 52 python iteration list
我想迭代列表中的所有内容,除了前几个元素,例如:
for line in lines[2:]:
foo(line)
Run Code Online (Sandbox Code Playgroud)
这是简洁的,但复制整个列表,这是不必要的.我可以:
del lines[0:2]
for line in lines:
foo(line)
Run Code Online (Sandbox Code Playgroud)
但这会修改列表,这并不总是好的.
我可以做这个:
for i in xrange(2, len(lines)):
line = lines[i]
foo(line)
Run Code Online (Sandbox Code Playgroud)
但是,这只是粗略的.
更好的可能是这个:
for i,line in enumerate(lines):
if i < 2: continue
foo(line)
Run Code Online (Sandbox Code Playgroud)
但它并不像第一个例子那么明显.
那么:这样做的方法与第一个例子一样明显,但不会不必要地复制列表?
sou*_*eck 43
你可以尝试itertools.islice(iterable[, start], stop[, step])
:
import itertools
for line in itertools.islice(list , start, stop):
foo(line)
Run Code Online (Sandbox Code Playgroud)
Eth*_*man 10
在大多数情况下,原始解决方案是合适的解决方案.
for line in lines[2:]:
foo(line)
Run Code Online (Sandbox Code Playgroud)
虽然这会复制列表,但它只是一个浅层副本,并且非常快.在分析代码并发现这是一个瓶颈之前,不要担心优化.
虽然itertools.islice
看起来是这个问题的最佳解决方案,但不知何故,额外的导入对于这么简单的事情来说似乎有些过分.
就个人而言,我发现enumerate
解决方案完全可读和简洁 - 虽然我更喜欢这样写:
for index, line in enumerate(lines):
if index >= 2:
foo(line)
Run Code Online (Sandbox Code Playgroud)
您可以构建一个辅助生成器:
def rangeit(lst, rng):
for i in rng:
yield lst[i]
for e in rangeit(["A","B","C","D","E","F"], range(2,4)):
print(e)
Run Code Online (Sandbox Code Playgroud)