Vamos a asumir que hay una lista de a = [1, 3, 5, 6, 8].

Quiero aplicar algún tipo de transformación en la lista y quiero evitar hacerlo de forma secuencial, algo así como map(someTransformationFunction, a) normalmente hace el truco, pero ¿y si la transformación debe tener conocimiento de que el índice de cada objeto?

Por ejemplo, digamos que cada elemento debe ser multiplicado por su posición. Así que la lista debe ser transformado a a = [0, 3, 10, 18, 32].

Hay una manera de hacer eso?

5 Comentarios

  1. 46

    Utilizar el enumerar() función para agregar los índices:

    map(function, enumerate(a))

    Su función se pasa un tupla, con (index, value). En Python 2, se puede especificar que Python desempaquetar la tupla para usted en la firma de función:

    map(lambda (i, el): i * el, enumerate(a))

    Nota la (i, el) tupla en la lambda argumento de la especificación. Usted puede hacer lo mismo en un def declaración:

    def mapfunction((i, el)):
        return i * el
    
    map(mapfunction, enumerate(a))

    Para dar paso a otra función características de la firma, tales como anotaciones, tupla desembalaje en los argumentos de la función se ha eliminado de Python 3.

    Demo:

    >>> a = [1, 3, 5, 6, 8]
    >>> def mapfunction((i, el)):
    ...     return i * el
    ...
    >>> map(lambda (i, el): i * el, enumerate(a))
    [0, 3, 10, 18, 32]
    >>> map(mapfunction, enumerate(a))
    [0, 3, 10, 18, 32]
    • +1 para poner de relieve el truco con tupla de la asignación en la definición de una función. Nunca he visto eso antes.
    • Así que el ejemplo sólo se aplica a python2?
    • Sí, en Python 3, el uso de un argumento (que va a ser una tupla); lambda i_el: i_el[0] * i_el[1]; en un def declaración puede descomprimir en una línea separada; def mapfunction(i_el):, salto de línea y sangría más, i, el = i_el, salto de línea, partido de sangría, return i * el.
  2. 12

    Puede utilizar enumerate():

    a = [1, 3, 5, 6, 8]
    
    answer = map(lambda (idx, value): idx*value, enumerate(a))
    print(answer)

    Salida

    [0, 3, 10, 18, 32]
  3. 7

    Para extender Martijn Pieters’ excelente respuesta, también se podría utilizar lista de comprensión en combinación con enumerate:

    >>> a = [1, 3, 5, 6, 8]
    >>> [i * v for i, v in enumerate(a)]
    [0, 3, 10, 18, 32]

    o

    [mapfunction(i, v) for i, v in enumerate(a)]

    Me siento lista de comprensión son a menudo más fácil de leer que map/lambda construcciones. Cuando se utiliza el nombre de una función de mapeo de que acepta la (i, v) tupla directamente, map probablemente gana, aunque.

    • tienes razón, en el caso posterior, la map notación tiene más sentido. En mi caso el uso de un nombre de función con el mapa era la elección correcta, ya que prácticamente la función que tenía que hacer un poco más que multiplicar por el índice.
  4. 2

    Para hacer compatible con Python3

    def map_fn(data):
        idx, el = data
        return idx*el
    
    my_list = [2,3,5,7]
    
    print(list(map(map_fn, list(enumerate(my_list)))))
  5. 0
    # Python3
    map(lambda args: print(args[0],args[1]) ,enumerate(a_list))
    # use arg list, just get the result with index
    
    # Python2
    map(lambda index,content: print(index,content) ,enumerate(a_list))

Dejar respuesta

Please enter your comment!
Please enter your name here