我有一个循环条件:
for count, item in enumerate(contents):但只想使用前10个元素的内容。做这件事的最重要的方式是什么?
做:
if count == 10: break看上去有点不像毕多诺。有更好的办法吗?
发布于 2014-01-06 14:04:47
使用切片(片符号)
for count, item in enumerate(contents[:10]):如果在生成器上迭代,或者列表中的项很大,并且不希望创建新列表的开销(就像切片一样),则可以使用来自itertools模块的itertools:
for count, item in enumerate(itertools.islice(contents, 10)):无论哪种方式,我都建议您以健壮的方式完成这一任务,这意味着将功能封装在函数中(就像使用这种功能一样--实际上,这就是使用name函数的原因)。
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.islice()作为您的函数。
for item in itertools.islice(contents, 10):发布于 2014-01-06 14:05:22
如果列表很大,或者contents是生成器,则使用itertools.islice()
from itertools import islice
for count, item in enumerate(islice(contents, 10)):对于较小的列表或元组,只需使用切片:
for count, item in enumerate(contents[:10]):切片创建了一个新的列表或元组对象,这对于10个条目来说并不是什么大问题。
发布于 2014-01-06 14:23:44
这只是对已经给出的两个答复的一个补充:
我提议考虑一下你现在的处境。为什么您想要进行10次迭代而不进行更多的迭代?是更希望在十个周期后中止(例如,因为每个周期需要很长的时间,整个运行时将受到限制而放弃完整性),还是您要求前十个元素是一组特殊的项目(可能是显示的十个元素)的原因?
在第一种情况下,我认为最正确的方法实际上是您提出的if ... break,因为它代表了您最直接的想法。
在后一种情况下,我建议给子元素命名,即为前十个元素(例如elements_to_display)的特殊组引入一个可说话的名称,并对它们进行迭代。
https://stackoverflow.com/questions/20951649
复制相似问题