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

218 投票
12 回答
220043 浏览
提问于 2025-04-16 01:39

我正在使用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来实现。

撰写回答