Cómo enumerar un rango de números que comienzan en 1

Estoy usando Python 2.5, quiero una enumeración así (empezando en 1 en lugar de 0):

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)] 

Sé que en Python 2.6 puedes hacer: h = enumerar (rango (2000, 2005), 1) para dar el resultado anterior, pero en python2.5 no puedes …

Utilizando python2.5:

 >>> h = enumerate(range(2000, 2005)) >>> [x for x in h] [(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)] 

¿Alguien sabe una manera de obtener el resultado deseado en Python 2.5?

Gracias,

Jeff

Como ya mencionó, esto es sencillo de hacer en Python 2.6 o más reciente:

 enumerate(range(2000, 2005), 1) 

Python 2.5 y versiones anteriores no admiten el parámetro de start , por lo que, en su lugar, puedes crear dos objetos de rango y comprimirlos:

 r = xrange(2000, 2005) r2 = xrange(1, len(r) + 1) h = zip(r2, r) print h 

Resultado:

 [(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

Si desea crear un generador en lugar de una lista, puede usar izip en su lugar.

Solo para poner esto aquí por causa de la posteridad, en 2.6 se agregó el parámetro “inicio” para enumerar así:

enumerate(sequence, start=1)

Fácil, solo define tu propia función que hace lo que quieres:

 def enum(seq, start=0): for i, x in enumerate(seq): yield i+start, x 

La forma más sencilla de hacer en Python 2.5 es exactamente lo que preguntas:

 import itertools as it ... it.izip(it.count(1), xrange(2000, 2005)) ... 

Si desea una lista, como parece, use zip en lugar de it.izip .

(Por cierto, como regla general, la mejor manera de hacer una lista de un generador o cualquier otro X iterable no es [x for x in X] , sino más bien list(X) ).

 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 

Ahora h = list(enumerate(xrange(2000, 2005), 1)) funciona.

Enumerar es trivial, y también lo está re-implementando para aceptar un inicio:

 def enumerate(iterable, start = 0): n = start for i in iterable: yield n, i n += 1 

Tenga en cuenta que esto no rompe el código utilizando la enumeración sin el argumento de inicio. Alternativamente, este oneliner puede ser más elegante y posiblemente más rápido, pero rompe otros usos de enumerar:

 enumerate = ((index+1, item) for index, item) 

Este último fue un puro disparate. @Duncan consiguió el envoltorio correcto.

 >>> list(enumerate(range(1999, 2005)))[1:] [(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)] 

h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]

Ok, me siento un poco estúpido aquí … ¿cuál es la razón para no hacerlo con algo como
[(a+1,b) for (a,b) in enumerate(r)] ? Si no funciona, no hay problema tampoco:

 >>> 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)] 
 >>> h = enumerate(range(2000, 2005)) >>> [(tup[0]+1, tup[1]) for tup in h] [(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)] 

Como esto es un tanto detallado, recomendaría escribir su propia función para generalizarla:

 def enumerate_at(xs, start): return ((tup[0]+start, tup[1]) for tup in enumerate(xs))