Estoy usando Python 2.5, quiero una enumeración como (a partir de 1 en lugar de 0):

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

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

El uso de 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 conseguir que el resultado deseado en python 2.5?

Gracias,

Jeff

  • Sólo por curiosidad, 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 hacer la actualización por razones de compatibilidad?
  • Todos los 2.x versión son compatibles, por lo que no es razón.
  • Que se lo digan a algunos módulos – hay algunos por ahí que el trabajo en Py 2.5 pero no Py 2.6
InformationsquelleAutor JeffTaggary | 2010-07-21

12 Comentarios

  1. 146

    Como ya se mencionó, esto es sencillo de hacer en Python 2.6 o posterior:

    enumerate(range(2000, 2005), 1)

    Python 2.5 y mayores, no apoyo la start parámetro por lo que en lugar, usted podría crear dos objetos range y zip ellos:

    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 quieres crear un generador en lugar de una lista, a continuación, puede utilizar izip lugar.

    • +1 para limpiar y simple y legible.
    • el uso de izip y xrange estaría más cerca de enumerar
    • Muy limpio, me encanta, gracias.
    • Esta respuesta está fuera de fecha, ahora puedes poner sólo enumerate(iterable, start=1) como de Python 2.6.
    • ¿Leyó la pregunta? Él ya sabe la solución para Python 2.6. Él preguntó específicamente para una solución que funciona en Python 2.5.
    • Al parecer me estoy ciego 🙂 de verdad lo siento. (Esta es la #1 en Google para «enumerar a partir de la 1»)
    • sí, acabo de llegar aquí desde google buscando «hace enumerar empezar desde cero python» 🙂

  2. 151

    Solo para poner esto aquí para la posteridad bien, en 2.6 el «inicio» parámetro fue añadido a enumerar así:

    enumerate(sequence, start=1)

    • Tenga en cuenta que esto no omitir el primer elemento de la lista, compensa el índice por el valor de inicio, por lo que se podría obtener una matriz fuera de límites si usted hizo algo como: sequence[i] en el código.
  3. 13

    Fácil, sólo tienes que 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
  4. 10

    Manera más sencilla de hacer en Python 2.5 exactamente lo que usted pregunta:

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

    Si quieres una lista, como usted parece, uso zip en lugar de it.izip.

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

  5. 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

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

    • 2.5 tiene count()
  6. 5

    enumerar es trivial, y así se vuelve a aplicar a 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 romper el código de uso de enumerar sin argumento start. como alternativa, este oneliner puede ser más elegante y posiblemente más rápido, pero se rompe otros usos de enumerar:

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

    El último fue pura tontería. @Duncan consiguió el contenedor de la derecha.

    • Su segunda solución da un error de sintaxis.
    • Sí, absurdo total. Algo a lo largo de estas líneas, que en realidad iba a trabajar, por ejemplo, en Haskell (alarmada es la cosa más natural en el lenguaje, y debido a su pereza, una función que recibe una lista es muy similar a la de un generador de expressiong). Pero eso no es excusa me – largo tiempo de python usuario de escritura de BS. Gracias por señalándolo.
  7. 4
    >>> list(enumerate(range(1999, 2005)))[1:]
    [(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
    • enumerar debe ser un generador. crear una lista a la vez sólo para iterar sobre si a menudo no es aceptable
    • Generalizada: inicio=4 lista(enumerar(inicio)+rango(1999, 2005)))[inicio:]
    • la gama es sin embargo la lista de 2.52
  8. 3

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

    • +1 para el oneliner
    • Él no puede hacer esto en Python 2.5. El parámetro de inicio fue introducido en Python 2.6: docs.python.org/library/functions.html#enumerate. También menciona esto en la pregunta.
    • para leer toda la pregunta…
    • Respondió a esto antes de la primera edición, cuando el código fue sin formato y el problema en que me parecía ser el uso de un generador en lugar de una lista.
    • ++: esa es la manera de hacerlo
    • Wow gracias por la magnitud de las opciones de los chicos.

  9. 2

    Ok, me siento un poco estúpido aquí… ¿cuál es la razón por la que no acaba de hacer con algo parecido

    [(a+1,b) for (a,b) in enumerate(r)] ? Si no va a funcionar, tampoco hay problema:

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

    Ya que esto es algo detallado, me gustaría recomendar la escritura de su propia función para generalizar que:

    def enumerate_at(xs, start):
        return ((tup[0]+start, tup[1]) for tup in enumerate(xs))
    • enumerar debe ser un generador. crear una lista a la vez sólo para iterar sobre si a menudo no es aceptable
    • start no está en uso 🙁
  11. 1

    Python 3

    La documentación oficial: enumerar(iterable, start=0)

    Por lo que se podría utilizar como esto:

    >>> 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')]
  12. 0

    No sé cómo estos puestos, posiblemente, podría ser más complicado, a continuación, las siguientes:

    # Just pass the start argument to enumerate ...
    for i,word in enumerate(allWords, 1):
        word2idx[word]=i
        idx2word[i]=word

Dejar respuesta

Please enter your comment!
Please enter your name here