我不是100%肯定如何提出问题的标题,但我想做的事情很简单。我想使用Python中的枚举函数循环遍历一个列表,但是我想知道是否可以通过2执行它,我会做的事情没有枚举,如下所示:
numbers = ['One', 'Two', 'Three', 'Four', 'Five']
i = 0
for number in numbers:
print(i, number)
i += 2
是否可以使用枚举函数(Pythonic方式)来实现,或者我应该像示例中那样做?
答案 0 :(得分:1)
将enumerate()
输出乘以两个:
for i, number in enumerate(numbers):
print(i * 2, number)
这基本上是{3}}对象在Python 3中的作用;计算任何给定指数的数量。由于您的系列从0开始,您所要做的就是将range()
乘以步长。
另一种方法是i
一个itertools.count()
object:
zip()
Python 3中的演示:
from itertools import count
try:
# Python 2, use the iterator version of zip
from future_builtins import zip
except ImportError:
# Python 3
pass
for i, number in zip(count(step=2), numbers):
print(i, number)
答案 1 :(得分:0)
对Martijn的两个Python 3接受的解决方案(在3.7.4上测试)进行了一些分析:
枚举():
python -m timeit -s "numbers = ['One', 'Two', 'Three', 'Four', 'Five']" "for i, n in enumerate(numbers): i*2"
500000 loops, best of 5: 403 nsec per loop
zip(count(...),...):
python -m timeit -s "from itertools import count; numbers = ['One', 'Two', 'Three', 'Four', 'Five']" "for i, n in zip(count(step=2), numbers): i"
500000 loops, best of 5: 690 nsec per loop
zip
/ count
方法要慢1.7倍。
枚举(...)和len(数字)== 5000 :
python -m timeit -s "numbers = ['One', 'Two', 'Three', 'Four', 'Five'] * 1000" "for i, n in enumerate(numbers): i*2"
1000 loops, best of 5: 324 usec per loop
zip(count(...),...)&len(numbers)== 5000 :
python -m timeit -s "from itertools import count; numbers = ['One', 'Two', 'Three', 'Four', 'Five'] * 1000" "for i, n in zip(count(step=2), numbers): i"
1000 loops, best of 5: 219 usec per loop
列表长度为5000,zip
/ count
方法快了三分之一,我的猜测是创建zip
和count
对象的开销使得对于较小的列表,此方法较慢,但最终由于必须频繁执行i * 2
而需要进行大量的迭代,因此最终无法解决问题。
当然,尽管比例看起来很重要,但在第一种情况下,我们说的是相差0.000000287
秒,而在大型列表中,我们说的是相差0.000105
秒。