如何枚举从 1 开始的数字范围
- 2025-03-18 08:55:00
- admin 原创
- 38
问题描述:
我正在使用 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 中获得所需的结果吗?
解决方案 1:
正如您已经提到的,这在 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:
只是为了方便后人理解,在 2.6 版中,添加了“start”参数来枚举,如下所示:
enumerate(sequence, start=1)
解决方案 3:
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
解决方案 4:
很简单,只需定义你自己的函数来执行你想要的操作:
def enum(seq, start=0):
for i, x in enumerate(seq):
yield i+start, x
解决方案 5:
在 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)
)。
解决方案 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))
可以工作。
解决方案 7:
枚举很简单,重新实现它来接受开始也很简单:
def enumerate(iterable, start = 0):
n = start
for i in iterable:
yield n, i
n += 1
请注意,这不会破坏使用不带起始参数的枚举的代码。或者,这个一行代码可能更优雅,可能更快,但会破坏枚举的其他用途:
enumerate = ((index+1, item) for index, item)
后者纯属胡说八道。@Duncan 的包装是正确的。
解决方案 8:
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
解决方案 9:
h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]
解决方案 10:
好吧,我觉得这里有点愚蠢……为什么不直接用类似的东西来做呢
[(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)]
解决方案 11:
>>> 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))
解决方案 12:
我不知道这些帖子怎么可能比下面的更复杂:
# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
word2idx[word]=i
idx2word[i]=word
扫码咨询,免费领取项目管理大礼包!