我有一个循环条件:
for count, item in enumerate(contents):
Run Code Online (Sandbox Code Playgroud)
但只想使用内容的前10个元素.什么是最蟒蛇的方式呢?
做一个:
if count == 10: break
Run Code Online (Sandbox Code Playgroud)
似乎有些不像Pythonic.有没有更好的办法?
Inb*_*ose 11
使用切片(切片表示法)
for count, item in enumerate(contents[:10]):
Run Code Online (Sandbox Code Playgroud)
如果您在生成器上进行迭代,或者列表中的项很大,并且您不希望创建新列表的开销(如切片那样),您可以islice从itertools模块中使用:
for count, item in enumerate(itertools.islice(contents, 10)):
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,我建议你以健壮的方式做到这一点,这意味着将功能包装在一个函数中(因为人们想要使用这样的功能 - 实际上,这是名称功能的原因)
import itertools
def enum_iter_slice(collection, slice):
return enumerate(itertools.islice(collection, slice))
Run Code Online (Sandbox Code Playgroud)
例:
>>> enum_iter_slice(xrange(100), 10)
<enumerate object at 0x00000000025595A0>
>>> list(enum_iter_slice(xrange(100), 10))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
>>> for idx, item in enum_iter_slice(xrange(100), 10):
print idx, item
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
Run Code Online (Sandbox Code Playgroud)
如果你使用enumerate和你的count变量来检查项目索引(这样你可以使用你的方法退出/打破第10项的循环.)你不需要枚举,只需使用itertools.islice()all就可以了功能.
for item in itertools.islice(contents, 10):
Run Code Online (Sandbox Code Playgroud)
如果列表很大或是contents生成器,请使用itertools.islice():
from itertools import islice
for count, item in enumerate(islice(contents, 10)):
Run Code Online (Sandbox Code Playgroud)
对于较小的列表或元组,只需使用切片:
for count, item in enumerate(contents[:10]):
Run Code Online (Sandbox Code Playgroud)
切片会创建一个新的列表或元组对象,这对于10个项目来说并不是什么大不了的事.