我使用的是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中你不能…
使用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中如何获得想要的结果?
正如你已经提到的,这在Python 2.6或更新版本中很简单:
enumerate(range(2000, 2005), 1)
Python 2.5及以上版本不支持start参数,所以你可以创建两个range对象并压缩它们:
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。
>>> 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))
好吧,我觉得自己有点傻……有什么理由不去做
[(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)]
Python 3
Python官方文档:enumerate(可迭代,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