我有一个循环条件:
for count, item in enumerate(contents):
但我只想使用前10个元素。最Pythonic的方法是什么?
可以这样做:
if count == 10: break
看起来有点不符合Python语言的风格,有更好的方式吗?
for count, item in enumerate(contents[:10]):
如果你正在迭代一个生成器,或者你的列表项很大并且不想创建一个新的列表(像切片一样),那么你可以使用itertools
模块中的 islice
:
for count, item in enumerate(itertools.islice(contents, 10)):
无论如何,我建议您以强健的方式进行操作,这意味着将功能封装在函数内(对于此类功能,人们往往会这样做-实际上,这就是函数名称的原因)
import itertools
def enum_iter_slice(collection, slice):
return enumerate(itertools.islice(collection, slice))
例子:
>>> 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
itertools.islice()
作为你的函数单独使用即可。for item in itertools.islice(contents, 10):
contents
是一个生成器,那么请使用itertools.islice()
:from itertools import islice
for count, item in enumerate(islice(contents, 10)):
对于较小的列表或元组,只需使用切片:
for count, item in enumerate(contents[:10]):
只是对已有两个答案的补充:
我建议思考你所处的情况。为什么你想要做10次迭代而不再多?这更多是希望在十个周期后中止(例如,因为每个周期需要很长时间,整个运行时间应受到限制,同时放弃完整性),还是你的要求背后的原因是前十个元素是一组特殊的项目(也许是要显示的十个)?
在第一种情况下,我会说最正确的方式实际上是你提出的if ... break
,因为它最直接地表达了你的想法。
在后一种情况下,我建议给孩子命名,即为前十个元素引入一个口语化的名称(例如,elements_to_display
),并对它们进行迭代。
enumerate()
进行其他操作? - Martijn Pieterscount
用作break
的标志外,您是否还在其他地方使用它? - thefourtheye