Code d'une ligne utilisant la condition map, lambda et if
En utilisant la compréhension de zip et de liste, créez une nouvelle liste, L3, qui additionne les deux nombres si le nombre de L1 est supérieur à 10 et le nombre de L2 est inférieur à 5. Cela peut être accompli en une seule ligne de code.
J'ai essayé les codes ci-dessous. Quelqu'un peut-il expliquer pourquoi Python se plaint?
L1 = [1, 5, 2, 16, 32, 3, 54, 8, 100]
L2 = [1, 3, 10, 2, 42, 2, 3, 4, 3]
L3 = map(lambda (x1,x2): x1 + x2 if(x1 > 10 and x2 < 5) , zip(L1,L2))
L4 = map(lambda x: x[0] + x[1] if(x[0] > 10 and x[1] < 5) , zip(L1,L2))
print(L3)
print(L4)
Réponses
Regardez ici : La fonction lambda doit avoir une valeur de retour et si votre instruction if n'est pas vraie, il n'y en a aucune. Par conséquent, vous devrez ajouter une instruction else, par exemple:
L4 = map(lambda x: x[0] + x[1] if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))
Résulte en
[0, 0, 0, 18, 0, 0, 57, 0, 103]
Votre premier essai (L3) ne fonctionne pas car lambda ne peut plus décompresser les tuples en python 3.x (voir: ici )
Veuillez également noter que map () renvoie un objet et que pour imprimer son contenu, vous devez appeler
print(list(map_object))
# in your case:
print(list(L4))
# or set()
Modifier en fonction du commentaire: si vous voulez vraiment un one-liner et que votre première phrase le dit "en utilisant le zip et la compréhension de liste" et que vous voulez omettre les 0, cela pourrait fonctionner et est plus facile que map et lambda:
L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]
Modifiez 2 si vous insistez vraiment, vraiment, vraiment sur l'utilisation de map et lambda:
L4 = map(lambda x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
C'est un problème XY . Vous utilisez une carte lorsqu'elle demande une compréhension de liste. Il s'agit essentiellement de demander un filtre, pas une carte.
>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]
Vous pourriez le faire dans un style fonctionnel, mais c'est tellement moche. Ne fais pas ça.
L3 = list(map(
lambda t: t[0]+t[1],
filter(
lambda t: t[0]>10 and t[1]<5,
zip(L1, L2)
)
))
print(L3) # -> [18, 57, 103]