大多数 Pythonic for / enumerate 循环?

Posted

技术标签:

【中文标题】大多数 Pythonic for / enumerate 循环?【英文标题】:Most Pythonic for / enumerate loop? 【发布时间】:2014-01-23 22:56:58 【问题描述】:

我有一个循环条件:

for count, item in enumerate(contents):

但只想使用内容的前 10 个元素。最pythonic的方法是什么?

做一个:

if count == 10: break

似乎有点不符合 Python 风格。有没有更好的办法?

【问题讨论】:

您是否使用enumerate() 来检测您是否已经循环了前 10 个项目? 是的,在将它们添加到另一个列表之前,我正在使用“项目”术语进行一些解析。 @Dirk 他的问题是,除了将其用作break 的标志之外,您是否在循环中的任何其他地方使用count 【参考方案1】:

使用切片(切片表示法)

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

如果您使用 enumerate 和 count 变量只是为了检查项目索引(以便使用您的方法,您可以退出/中断第 10 个项目的循环。)您不需要枚举,只需使用itertools.islice() 全部作为您的功能。

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

【讨论】:

【参考方案2】:

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

from itertools import islice

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

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

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

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

【讨论】:

【参考方案3】:

只是对已经给出的两个答案的补充:

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

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

在后一种情况下,我建议给孩子命名,i。 e.为前十个元素组成的特殊组引入一个口号(例如elements_to_display)并对其进行迭代。

【讨论】:

以上是关于大多数 Pythonic for / enumerate 循环?的主要内容,如果未能解决你的问题,请参考以下文章

在 config.py 中提供全局配置变量的大多数 Pythonic 方式? [关闭]

将 CSV 值读入列表字典的大多数 Pythonic 方式

大多数pythonic方式分配和访问可空对象

在编译时提供函数元数据的大多数 Pythonic 方式?

在 for 循环中哪个更 Pythonic:压缩还是枚举?

使用不同过滤器针对同一个列表处理多个 for 循环的 Pythonic 方法?