J'ai 2 listes dans une classe python3:

self.keys = ["a","b","c","d"]
self.values = [1,2,3,4]

Len (self.keys) == len (self.values), toujours.

Je veux créer une chaîne qui imite la sortie d'impression d'un dictionnaire: {a:1, b:2, c:3, d:4}

Je le fais dans une méthode qui contient:

sr = ""
for i,k in enumerate(self.keys):
    sr += "{}:{},".format(k,self.values[i])
return "{%s}" % sr[:len(sr)-1]

Est-ce possible en une seule ligne? sinon, existe-t-il une meilleure façon de procéder?

1
erebos007 6 mars 2016 à 20:42

3 réponses

Meilleure réponse

Utilisez zip, puis faites-en un dict:

keys = ["a","b","c","d"]
values = [1,2,3,4]

dict(zip(keys, values))

Production:

{'b': 2, 'a': 1, 'c': 3, 'd': 4}
9
idjaw 6 mars 2016 à 17:45

Pourquoi ne pas simplement imprimer un dictionnaire? Utilisez zip pour créer des tuples des paires, puis passez les au constructeur dict.

print(dict(zip(self.keys, self.values)))
4
Holloway 6 mars 2016 à 17:45

Si vous souhaitez obtenir exactement le format produit par votre code d'origine avec une seule ligne de code, vous pouvez utiliser

from itertools import starmap

print("{%s}" % ",".join(starmap("{}:{}".format, zip(keys, values))))

Je ne suis pas sûr que ce soit plus lisible que votre code d'origine.

1
Sven Marnach 6 mars 2016 à 17:59