2010-07-21 19 views
76

estoy usando Python 2.5, quiero una enumeración como tal (empezando por 1 en vez de 0):cómo enumerar una serie de números a partir de 1

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

sé en Python 2.6 que puede hacer: h = enumerate (rango (2000, 2005), 1) para dar el resultado anterior pero en python2.5 no se puede ...

Usando 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 ese resultado deseado en Python 2.5?

Gracias,

Jeff

+2

Justo curioso, ya que soy alguien que no ha hecho mucho en el camino de Python profesionalmente. ¿Está limitado a Python 2.5 porque su empresa no desea realizar la actualización por razones de compatibilidad? – Sean

+1

Todas las versiones 2.x son compatibles con versiones anteriores, por lo que no hay motivo. –

+0

lo digan a algunos módulos - hay algunos por ahí que el trabajo en Py 2,5 pero no Py 2,6 – xorsyst

Respuesta

93

Como ya se ha mencionado, esto es sencillo de hacer en Python 2.6 o posterior:

enumerate(range(2000, 2005), 1) 

Python 2.5 y anteriores no admiten el parámetro start por lo que podría 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 utilizar izip lugar.

+3

+1 para limpio y simple y legible. – zdav

+0

usando '' izip' y xrange' estaría más cerca de enumerar –

+0

Muy limpio, me encanta, gracias. – JeffTaggary

1

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

+0

1 para la oneliner – Randolpho

+1

No puede hacer esto en Python 2.5. El parámetro de inicio se introdujo en Python 2.6: http://docs.python.org/library/functions.html#enumerate. Él también menciona esto en la pregunta. –

+0

manera de leer la pregunta completa ... – Ponkadoodle

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

Dado que este es un poco prolijo, me gustaría recomendar a escribir su propia función para generalizarlo:

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

enumeración debe ser un generador. la creación de una lista completa de una vez sólo para iterar sobre si a menudo no es aceptable –

+2

'start' no se usa :( –

4
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)) obras.

+1

2.5 TIENE' count() ' –

10

fácil, simplemente definir su propia función que hace lo que quiere:

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

enumeración es trivial, y así se vuelve a implementarlo para aceptar un comienzo:

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

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

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

Este último era puro disparate. @Duncan tiene el envoltorio correcto.

+0

Su segunda solución da un error de sintaxis. – Philipp

+0

Sí, absurdo total. Algo a lo largo de estas líneas sería en realidad el trabajo en, por ejemplo Haskell (currificación es lo más natural nunca en ese idioma, y ​​debido a su pereza, una función que toma una lista es muy similar a un generador expressiong) Pero eso no me exime -. largo tiempo pitón ... de usuario - escritura BS Gracias por señalarlo – delnan

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

enumeración debe ser un generador de creación de una lista completa de una vez solo para repetir, aunque a menudo no es aceptable –

+0

generalizada: inicio = 4 lista (enumerar (rango (iniciar) + rango (1999, 2005))) [inicio:] –

+0

alcance sin embargo lista en 2.52 –

8

Simplest manera de hacer en Python 2.5 exactamente lo que usted pregunta por:

import itertools as it 

... it.izip(it.count(1), xrange(2000, 2005)) ... 

Si desea una lista, ya que pareces, utilice 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 es iterable no[x for x in X], sino más bien list(X)).

1

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 va a funcionar, no hay problema, ya sea:

>>> 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)] 
118

Sólo para poner esto aquí por causa de la posteridad, en 2.6 "START" se añadió parámetro para enumerar así:

enumerate(sequence, start=1)

+6

+1 ¡Dios me gusta! – KJW

+2

Tenga en cuenta que esto no omitir el primer elemento de la lista, que compensa el índice por el valor de inicio, por lo que obtendría una matriz fuera de límites si se hizo algo como: 'secuencia [i] 'en el código. – phyatt

Cuestiones relacionadas