2010-06-08 8 views
13

Me preguntaba si hay una forma de ejecutar el mapa en algo. La forma en que funciona el mapa es que requiere una iteración y aplica una función a cada elemento en esa iterable producción de una lista. ¿Hay alguna manera de que el mapa modifique el objeto iterable en sí?Python: mapa en el lugar

+0

sólo se puede hacer de manera eficiente esta en Python con una secuencia mutable (es decir, una lista), no una iterable arbitraria. – jemfinch

+1

Correcto, estoy trabajando con una lista. – johannix

Respuesta

1

Se puede utilizar un lambda (o una def) o una lista mejor comprensión (si es suficiente):

[ do_things_on_iterable for item in iterable ] 

De todos modos se puede querer ser más explícito con un bucle si las cosas se vuelven demasiado complejo.

Por ejemplo, puede hacer algo similar, pero que en mi humilde opinión es feo:

[ mylist.__setitem__(i,thing) for i,thing in enumerate(mylist) ] 
1

Sólo tiene que escribir el código obvio para hacerlo.

for i, item in enumerate(sequence): 
    sequence[i] = f(item) 
+0

Ya lo intenté ... extrañamente es más lento que la comprensión de la lista. La razón por la que hice esta pregunta es porque pensé que el mapa sería más rápido que la lista de comprensión, y tampoco veo el sentido de crear una nueva lista, pero hasta ahora la comprensión de la lista es ganadora. – johannix

+0

comprensión de la lista == sintaxis azúcar para el mapa – carl

+2

¿Cómo se explica el rendimiento alcanzado entonces? el mapa era aproximadamente el doble de lento. – johannix

2

Es lo suficientemente simple para escribir:

def inmap(f, x): 
    for i, v in enumerate(x): 
      x[i] = f(v) 

a = range(10) 
inmap(lambda x: x**2, a) 
print a 
+0

Eso es lógicamente correcto, pero yo quería usar un mapa para mejoras de rendimiento ... – johannix

+0

No creo que se puede exprimir mucho más rendimiento de esto. Si quiere paralelizarlo, no podría hacerlo en su lugar con Python debido al GIL. – carl

7

Una asignación rebanada es a menudo bien si tiene que modificar una lista en su lugar

mylist[:] = map(func, mylist) 
Cuestiones relacionadas