web-dev-qa-db-fra.com

Puis-je utiliser des informations d'index dans la fonction de carte?

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?

28
LetsPlayYahtzee

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]
45
Martijn Pieters

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]
12
gtlambert

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.

7
marcelm

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)))))
2
Dario Cazzani
# 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))
0
Benchur Wong