在枚举python中包含停止参数的最简单方法?

Posted

技术标签:

【中文标题】在枚举python中包含停止参数的最简单方法?【英文标题】:Easiest way to include a stop parameter in enumerate python? 【发布时间】:2014-03-08 13:41:46 【问题描述】:

Ss 有一种简单的方法来迭代一个可迭代对象,它允许指定一个终点,比如 -1,以及枚举中的起点。例如

for i, row in enumerate(myiterable, start=2): # will start indexing at 2

如果我的对象的长度为 10,那么让它在索引 2 处开始迭代并在索引 9 处停止迭代的最简单方法是什么?

或者,是否有来自 itertools 的东西更适合这个。我对高性能方法特别感兴趣。

另外,在 2.6 中引入 start 选项时,是否有什么原因没有 stop 选项?

干杯

【问题讨论】:

【参考方案1】:
for i, row in enumerate(myiterable[2:], start=2):
   if i>= limit: break
   ...

for i,row in itertools.takewhile(lambda (i,val):i < limit,enumerate(myiterable[2:],2)):

改写另一个建议(请注意,它仅在您的可迭代对象是可切片对象时才有效)

start,stop = 11,20
my_items = range(100)
for i,row in enumerate(my_items[start:stop],start):
      ....

【讨论】:

感谢@Joran Beasley,两者都是不错的选择,非常有帮助。我知道对下一个问题的明显反应是自己进行基准测试,但是如果您认为一种方法比另一种方法更快,您是否有任何暗示?还是更喜欢大型或小型物体等? 他们都是短期的,所以他们在执行方面应该是平等的......或接近它......【参考方案2】:

我想你误解了'start'关键字,它不会跳到iterable中的第n个项目,它从n开始计数,例如:

for i, c in enumerate(['a', 'b', 'c'], start=5):
    print i, c

给出:

5 a
6 b
7 c

对于像列表和元组这样的简单迭代,最简单和最快的方法是这样的:

obj = range(100)
start = 11
stop = 22
for i, item in enumerate(obj[start:stop], start=start):
    pass

【讨论】:

我明白它的作用。即从 2 开始遍历 0-9 的列表将打印到 i = 11,c = 9。也许我错误地表达了这个问题。不过指出得很好。 这似乎是正确的答案【参考方案3】:

如果我不打算使用可迭代项的整个长度,我发现使用以下内容更容易:

for i in range(2, len(myiterable)):

而不是枚举。然后在循环内基于 i 进行索引。与使用枚举的其他方法相比,它需要更少的输入。

【讨论】:

【参考方案4】:

创建可迭代对象的切片可能会很昂贵。为避免这种情况,请使用itertools.islice:

import itertools

for item in itertools.islice('abc', 0, 2):
  print(item)

# will print:
1
2

【讨论】:

以上是关于在枚举python中包含停止参数的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中设置枚举的最简洁方法是啥? [复制]

在 JSON 输出中包含 get_absolute_url 值

后台提示,你的参数中包含非法字符,怎么办?

SpringMVC详解------参数绑定

使用 python 查看 .gz 存档中包含的文件

如何在Java中包含多个方法?枚举不是正确的方法吗?