1
votes

Comment passer la liste de tuple à la fonction lambda

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?


0 commentaires

4 Réponses :


3
votes

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.


2 commentaires

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 .



1
votes

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())


0 commentaires

1
votes

Comme déjà suggéré, vous pouvez transmettre plusieurs itérables à 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']

Ou utilisez itertools.starmap

: p>
>>> list(map(lambda k, v: "%s=%s" % (k, v), *zip(*t_dict.items())))
['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']


1 commentaires

@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.



0
votes

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>


0 commentaires