如何枚举从1开始的一系列数字

我正在使用Python 2.5,我想像这样的枚举(从1开始,而不是0):

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)] 

我知道在Python 2.6中,你可以这样做:h = enumerate(范围(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中获得所需结果的方法?

谢谢,

杰夫

正如你已经提到的,在Python 2.6或更新版本中,这是很简单的:

 enumerate(range(2000, 2005), 1) 

Python 2.5及更高版本不支持start参数,所以您可以创build两个范围对象并对其进行压缩:

 r = xrange(2000, 2005) r2 = xrange(1, len(r) + 1) h = zip(r2, r) print h 

结果:

 [(1,2000),(2,2001),(2002,2002),(4,2003),(5,2004)]

如果你想创build一个生成器而不是列表,那么你可以使用izip来代替。

为了后代的缘故,在2.6中添加了“start”参数来枚举:

enumerate(sequence, start=1)

简单,只需定义你自己的function,做你想做的事情:

 def enum(seq, start=0): for i, x in enumerate(seq): yield i+start, x 

在Python 2.5中最简单的方法正是你所问的:

 import itertools as it ... it.izip(it.count(1), xrange(2000, 2005)) ... 

如果你想要一个列表,如你it.izip ,使用zip代替it.izip

(顺便说一句,作为一个生成器或任何其他可迭代X列表的最佳方式是不是 [x for x in X] ,而是list(X) )。

 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))作品。

枚举是微不足道的,所以重新实现它接受一个开始:

 def enumerate(iterable, start = 0): n = start for i in iterable: yield n, i n += 1 

请注意,这不会使用枚举来分解代码,而无需启动参数。 或者,这个oneliner可能更优雅,可能更快,但打破了枚举的其他用途:

 enumerate = ((index+1, item) for index, item) 

后者是纯粹的废话。 @Duncan得到了包装的权利。

 >>> list(enumerate(range(1999, 2005)))[1:] [(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)] 

h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]

好吧,我觉得在这里有点愚蠢…什么原因不能用类似的东西来做
[(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)] 
 >>> h = enumerate(range(2000, 2005)) >>> [(tup[0]+1, tup[1]) for tup in h] [(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)] 

由于这有点冗长,我build议编写自己的函数来概括它:

 def enumerate_at(xs, start): return ((tup[0]+start, tup[1]) for tup in enumerate(xs))