2017-10-18 13 views
-2

Je comprends que min me donnera le plus petit élément si j'utilise une liste ou un groupe de numérosfonction python min avec deux arugments itérables

min([5, 10])] >>> 5 
min((5, 10)) >>> 5 

mais quand cela a été utilisé sur la carte:

L1 = [1, 28, 36] 
L2 = [2, 57, 9] 
for elt in map(min, L1, L2): 
    print(elt) 

il me redonne:

1 
28 
9 

est la carte suppose de ne pas me aider à appliquer min à L1 et L2 à son tour? et je suis un peu attendais:

1 
2 
+1

Lisez la documentation [ 'map'] (https://docs.python.org/ 3/library/functions.html # map). Vous faites essentiellement 'map (min, zip (L1, L2))' –

+0

Ajoutez des parenthèses autour de * L1 * et * L2 * comme ceci '' map (min, [L1, L2]) ''. –

Répondre

4

Si vous voulez que le min de chacun de plusieurs listes, vous devez créer une liste (ou itérable) des listes à la main à la carte:

for elt in map(min, (L1, L2)): 
    print(elt) 

Cela a pour effet d'appeler min(L1) puis min(L2).

map peut prendre n'importe quel nombre d'arguments itératifs; il assemble tous les éléments correspondants des itérations et les passe tous à la fonction fournie. Donc map(min, L1, L2) est similaire à (min(L1[0], L2[0]), min(L1[1], L2[1]), min(L1[2], L2[2])) (sauf que c'est un itérable, pas un tuple).

+0

Fondamentalement, comme @PatrickHaugh a dit, c'est comme si son code est 'map (min, zip (L1, L2))'. –

+0

l'ai eu !! Merci! –

+0

@ ChristianDean: Dans ce cas, c'est; ce n'est généralement pas le cas, cependant.Cela fonctionne parce que 'min' arrive à calculer le minimum d'un seul itérable (si on lui donne un argument) ou le minimum de tous ses arguments (si on lui donne plus d'un argument). – rici

0

Si vos listes sont

L1 = [1, 28, 36] 
L2 = [2, 57, 9] 

puis

map(min, L1, L2) 

appliquera la fonction min() aux éléments correspondants de L1, L2:

min(1, 2)  # result: 1 
min(28, 57)  # result: 28 
min(36, 9)  # result: 9 

(Mais le fera que s'il y a une demande de son évaluation (que l'on appelle une évaluation paresseuse) - comme la boucle for dans votre cas - il ne retourne pas une liste [1, 28, 9], mais un objet map.

L'objet map est une sorte de iterator - quelque chose comme une recette comment le faire.

Pourquoi? Parce que listes peuvent être très très long, mais la recette est toujours la même -. Le court un)

+0

merci beaucoup, il était en effet comme zip (L1, L2) –

+0

Vous avez raison - c'est * comme * la fonction intégrée 'zip()', mais il * ne pas effectuer 'zip()' * comme un résultat temporaire (donnant des paires) mais il donne directement les * valeurs de retour de la fonction mappée *. – MarianD