大多数Pythonic for /枚举循环?

时间:2014-01-06 14:04:12

标签: python enumerate

我有一个循环条件:

for count, item in enumerate(contents):

但只想使用内容的前10个元素。什么是最蟒蛇的方式呢?

做一个:

if count == 10: break

似乎有点不像Pythonic。还有更好的方法吗?

3 个答案:

答案 0 :(得分:11)

使用切片(切片表示法)

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

如果您正在迭代生成器,或者列表中的项目很大并且您不希望创建新列表的开销(如切片那样),您可以使用{{3}中的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

如果你使用枚举和你的count变量来检查项目索引(这样你可以使用你的方法退出/打破第10项的循环。)你不需要枚举,只是单独使用itertools all作为您的函数。

for item in itertools.islice(contents, 10):

答案 1 :(得分:5)

如果列表很大或contents是生成器,请使用itertools.islice()

from itertools import islice

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

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

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

切片会创建一个新的列表或元组对象,对于10个项目来说这不是什么大不了的事。

答案 2 :(得分:0)

只是已经给出的两个答案的附录:

我建议思考关于你所处的情况。为什么是你想做10次迭代而不是更多?是否希望在十个周期后中止(例如,因为每个周期占用很长时间并且整个运行时间在限制时放弃完整性)或者是你要求前十个元素是一组特殊项目的原因(可能要显示十个)?

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

在后一种情况下,我建议给孩子起名字,我。即为前十个元素中的特殊组(例如elements_to_display)引入一个发音名称并对其进行迭代。