我使用的是Python 2.5,我想要一个这样的枚举(从1开始而不是0):
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
我知道在Python 2.6中你可以这样做:h = enumerate(range(2000,2005),1)给出上面的结果,但在python2.5中你不能......
使用python2.5:
>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]
有谁知道在python 2.5中获得所需结果的方法?
谢谢,
杰夫
答案 0 :(得分:147)
为了后人的缘故,这里只是为了这个,在2.6中添加“start”参数进行枚举,如下所示:
enumerate(sequence, start=1)
答案 1 :(得分:139)
正如您已经提到的,这在Python 2.6或更新版本中很简单:
enumerate(range(2000, 2005), 1)
Python 2.5及更早版本不支持start
参数,因此您可以创建两个范围对象并压缩它们:
r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h
结果:
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
如果您想创建一个生成器而不是列表,那么您可以改为使用izip。
答案 2 :(得分:13)
简单,只需定义自己的功能即可:
def enum(seq, start=0):
for i, x in enumerate(seq):
yield i+start, x
答案 3 :(得分:10)
在Python 2.5中最简单的方法就是你所要求的:
import itertools as it
... it.izip(it.count(1), xrange(2000, 2005)) ...
如果您想要列表,请使用zip
代替it.izip
。
(顺便说一句,作为一般规则,从生成器或任何其他可迭代X中生成列表的最佳方法是不 [x for x in X]
,而是list(X)
)
答案 4 :(得分:6)
from itertools import count, izip
def enumerate(L, n=0):
return izip( count(n), L)
# if 2.5 has no count
def count(n=0):
while True:
yield n
n+=1
现在h = list(enumerate(xrange(2000, 2005), 1))
有效。
答案 5 :(得分:5)
枚举是微不足道的,因此重新实现它以接受一个开始:
def enumerate(iterable, start = 0):
n = start
for i in iterable:
yield n, i
n += 1
请注意,这不会在没有start参数的情况下使用enumerate来破坏代码。 或者,这个oneliner可能更优雅,可能更快,但打破了枚举的其他用途:
enumerate = ((index+1, item) for index, item)
后者纯粹是胡说八道。 @Duncan得到了正确的包装。
答案 6 :(得分:4)
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
答案 7 :(得分:3)
h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]
答案 8 :(得分:2)
好的,我觉得这里有点愚蠢......不用这样的东西就是这样做的原因是什么
[(a+1,b) for (a,b) in enumerate(r)]
?如果你不能运作,也没问题:
>>> r = range(2000, 2005)
>>> [(a+1,b) for (a,b) in enumerate(r)]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
>>> enumerate1 = lambda r:((a+1,b) for (a,b) in enumerate(r))
>>> list(enumerate1(range(2000,2005))) # note - generator just like original enumerate()
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
答案 9 :(得分:1)
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
由于这有点冗长,我建议编写自己的函数来概括它:
def enumerate_at(xs, start):
return ((tup[0]+start, tup[1]) for tup in enumerate(xs))
答案 10 :(得分:0)
我不知道这些帖子如何变得比以下内容更复杂:
# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
word2idx[word]=i
idx2word[i]=word
答案 11 :(得分:0)
官方文档:enumerate(iterable, start=0)
所以您可以这样使用它:
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]