最符合Python风格的for/枚举循环是什么?

8

我有一个循环条件:

for count, item in enumerate(contents):

但我只想使用前10个元素。最Pythonic的方法是什么?

可以这样做:

if count == 10: break

看起来有点不符合Python语言的风格,有更好的方式吗?


除了检测循环遍历的前10个项目之外,您是否还使用enumerate()进行其他操作? - Martijn Pieters
是的,我正在使用“item”这个术语在将它们添加到另一个列表之前进行一些解析。 - Dirk
@Dirk 他的问题是指,在循环中除了将 count 用作 break 的标志外,您是否还在其他地方使用它? - thefourtheye
3个回答

13
使用切片(切片符号)
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

如果你使用枚举和计数变量只是为了检查项目的索引(这样你就可以在第10个项目上使用你的方法退出/中断循环),你不需要枚举,只需将itertools.islice()作为你的函数单独使用即可。
for item in itertools.islice(contents, 10):

6
如果列表很大或者contents是一个生成器,那么请使用itertools.islice():
from itertools import islice

for count, item in enumerate(islice(contents, 10)):

对于较小的列表或元组,只需使用切片:

for count, item in enumerate(contents[:10]):

切片操作会创建一个新的列表或元组对象,对于10个元素来说并不算太大的开销。

0

只是对已有两个答案的补充:

我建议思考你所处的情况。为什么你想要做10次迭代而不再多?这更多是希望在十个周期后中止(例如,因为每个周期需要很长时间,整个运行时间应受到限制,同时放弃完整性),还是你的要求背后的原因是前十个元素是一组特殊的项目(也许是要显示的十个)?

在第一种情况下,我会说最正确的方式实际上是你提出的if ... break,因为它最直接地表达了你的想法。

在后一种情况下,我建议给孩子命名,即为前十个元素引入一个口语化的名称(例如,elements_to_display),并对它们进行迭代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接