如何从1开始枚举一系列数字
我正在使用Python 2.5,我想要一个像这样的枚举(从1开始,而不是从0开始):
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
我知道在Python 2.6中,你可以这样做:h = enumerate(range(2000, 2005), 1) 来得到上面的结果,但在Python 2.5中你不能这样做...
使用Python 2.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 个回答
43
Python 3
官方Python文档: enumerate(iterable, start=0)
你不需要像其他回答里提到的那样自己写一个生成器。Python自带的标准库里已经有一个函数,正好能满足你的需求:
>>> 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')]
这个内置函数的功能和下面这个是一样的:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
197
为了让后人知道,在2.6版本中,给enumerate函数添加了一个叫“start”的参数,使用方法如下:
enumerate(sequence, start=1)
244
正如你已经提到的,在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来实现。