Supposons qu'il existe une liste a = [1, 3, 5, 6, 8]
.
Je veux appliquer une transformation sur cette liste et je veux éviter de le faire séquentiellement, donc quelque chose comme map(someTransformationFunction, a)
ferait normalement l'affaire, mais que se passe-t-il si la transformation doit avoir connaissance de l'index de chaque objet?
Par exemple, disons que chaque élément doit être multiplié par sa position. La liste doit donc être transformée en a = [0, 3, 10, 18, 32]
.
Y-a-t-il un moyen de faire ça?
Utilisez la fonction enumerate()
pour ajouter des indices:
map(function, enumerate(a))
Votre fonction recevra un Tuple , avec (index, value)
. Dans Python 2, vous pouvez spécifier que Python décompressez le Tuple pour vous dans la signature de la fonction:
map(lambda (i, el): i * el, enumerate(a))
Noter la (i, el)
Tuple dans la spécification de l'argument lambda. Vous pouvez faire de même dans une instruction def
:
def mapfunction((i, el)):
return i * el
map(mapfunction, enumerate(a))
Pour faire place à d'autres fonctionnalités de signature de fonction telles que les annotations, le décompactage de tuple dans les arguments de fonction a été supprimé de Python 3.
Démo:
>>> 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]
Vous pouvez utiliser enumerate()
:
a = [1, 3, 5, 6, 8]
answer = map(lambda (idx, value): idx*value, enumerate(a))
print(answer)
Sortie
[0, 3, 10, 18, 32]
Pour étendre l'excellente réponse de Martijn Pieters, vous pouvez également utiliser list comprehensions en combinaison avec enumerate
:
>>> a = [1, 3, 5, 6, 8]
>>> [i * v for i, v in enumerate(a)]
[0, 3, 10, 18, 32]
ou
[mapfunction(i, v) for i, v in enumerate(a)]
Je pense que les compréhensions de liste sont souvent plus lisibles que les constructions map
/lambda
. Lorsque vous utilisez une fonction de mappage nommée qui accepte le (i, v)
Tuple directement, map
gagne probablement cependant.
Pour rendre compatible avec 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)))))
# 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))