Lorsque la liste des tuples est utilisée dans la boucle for, cela fonctionne parfaitement avec deux variables séparées comme ci-dessous
print map(lambda k, v: "%s=%s" % (k, v), t_dict.items()) Traceback (most recent call last): File "test.py", line 14, in <module> print map(lambda k, v: "%s=%s" % (k, v), t_dict.items()) TypeError: <lambda>() takes exactly 2 arguments (1 given)
Mais une fois converti en lambda avec la fonction map, il y a une erreur comme ci-dessous
XXX
Y a-t-il un autre moyen d'appeler la liste de tuple dans la fonction lambda?
4 Réponses :
La carte
intégrée prend en charge plusieurs itérables:
res = map(lambda k, v: "%s=%s" % (k, v), t_dict, t_dict.values()) # ['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']
Comme décrit dans la documentation pour map
:
Si des arguments itérables supplémentaires sont passés, la fonction doit prendre que de nombreux arguments et est appliqué aux éléments de tous les itérables dans parallèle.
il devrait y avoir un moyen plus élégant, map ('{} = {}'. format, t_dict, t_dict.values ())
est le meilleur auquel je puisse penser
@Chris_Rands, Yup, bon point. Cependant, je voulais conseiller OP sur la question plus générale de l'utilisation d'une fonction multi-arguments avec map
.
Pour votre cas, vous pouvez également utiliser le tuple après le %
pour le formatage, donc:
map(lambda t: "%s=%s" % t, t_dict.items())
Comme déjà suggéré, vous pouvez transmettre plusieurs itérables à Ou utilisez map
, mais si vous souhaitez passer les éléments
et non les touches
et valeurs
individuellement, vous pouvez utiliser zip (* ...)
pour "transposer" les éléments à deux listes et utilisez à nouveau *
pour les passer comme deux arguments différents à map
:>>> from itertools import starmap
>>> list(starmap(lambda k, v: "%s=%s" % (k, v), t_dict.items()))
['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']
itertools.starmap
>>> list(map(lambda k, v: "%s=%s" % (k, v), *zip(*t_dict.items()))) ['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']
@Chris_Rands Oui, c'est plus agréable que le lambda
, mais c'est toujours une fonction prenant deux paramètres, donc cela ne change vraiment rien au problème de base.
Une autre option est de cette façon ( str.join ( iterable)
) pour obtenir la liste des chaînes:
import sys map( lambda t: sys.stdout.write("=".join(t) + "\n"), t_dict.items() ) #Â k3=v3 #Â k2=v2 #Â k1=v1 #Â k5=v5 #Â k4=v4
Cette version peut également imprimer:
map( lambda t: "=".join(t), t_dict.items() ) #=> ['k3=v3', 'k2=v2', 'k1=v1', 'k5=v5', 'k4=v4']
p>