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>