2010-06-08 4 views
13

Je me demandais s'il y avait un moyen d'exécuter une carte sur quelque chose. La méthode de la carte fonctionne, elle prend une itérative et applique une fonction à chaque élément de ce itérable produisant une liste. Existe-t-il un moyen pour que map modifie l'objet itérable lui-même?Python: carte en place

+0

Vous ne pouvez le faire efficacement ce en Python avec une séquence mutable (c'est-à-dire une liste), pas un itérable arbitraire. – jemfinch

+1

À droite, je travaille avec une liste. – johannix

Répondre

1

Vous pouvez utiliser un lambda (ou une définition) ou une meilleure compréhension de la liste (si elle est suffisante):

[ do_things_on_iterable for item in iterable ] 

Quoi qu'il en soit, vous voudrez peut-être plus explicite avec une boucle si les choses deviennent trop complexe.

Par exemple, vous pouvez faire quelque chose comme ça, mais IMHO il est laid:

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

il suffit d'écrire le code évident pour le faire.

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

J'ai déjà essayé ça ... bizarrement c'est plus lent que la compréhension de la liste. La raison pour laquelle j'ai posé cette question est parce que je pensais que la carte serait plus rapide que la compréhension de la liste, et je ne vois pas l'intérêt de créer une nouvelle liste, mais jusqu'à présent la compréhension de la liste est gagnante. – johannix

+0

compréhension de la liste == syntaxe sucre pour la carte – carl

+2

Comment expliquez-vous la performance alors? La carte était à peu près deux fois plus lente. – johannix

2

Il est assez simple d'écrire:

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

Cela est logiquement correct, mais je voulais utiliser la carte pour les gains de performance ... – johannix

+0

Je ne pense pas que vous pouvez presser beaucoup plus de performance sur ce point. Si vous voulez le paralléliser, vous ne pourrez pas le faire avec Python en raison du GIL. – carl

7

Une affectation de tranche est souvent ok si vous avez besoin de modifier une liste en place

mylist[:] = map(func, mylist)