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

时间:2010-07-21 20:37:35

标签: python enums

我使用的是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中获得所需结果的方法?

谢谢,

杰夫

12 个答案:

答案 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)

Python 3

官方文档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')]