liste de dictionnaire de conversion avec plusieurs valeurs pour la clé?
J'ai une liste Python qui détient les paires de clé/valeur:
l=[ [1, 'A'], [1, 'B'], [2, 'C'] ]
Je veux convertir la liste dans un dictionnaire, où plusieurs valeurs par clé doit être regroupé dans un n-uplet:
{ 1:('A', 'B'), 2:('C',) }
La solution itérative est trivial:
l=[ [1, 'A'], [1, 'B'], [2, 'C'] ]
d={}
for pair in l:
if d.has_key(pair[0]):
d[pair[0]]=d[pair[0]]+tuple(pair[1])
else:
d[pair[0]]=tuple(pair[1])
print d
{1: ('A', 'B'), 2: ('C',)}
Est-il plus élégant, Pythonic solution pour cette tâche?
- s/multilpe/plusieurs
has_key
est sur son chemin vers la poubelle de l'Python histoire - si vous devez tester l'existence d'une clé dans un dict, veuillez utiliser la nouvelle syntaxeif key in dict:
. Mais la "Une" réponse à votre question est @eumiro de defaultdict approche.- Merci. L'ajout d'un
/g
le rendre plus générique 🙂 - has_key() a été supprimé dans python 3 lien Supprimé. dict.has_key() – utiliser l'opérateur à la place.
InformationsquelleAutor Adam Matan | 2011-03-21
Vous devez vous connecter pour publier un commentaire.
d
contient maintenant{1: ('A', 'B'), 2: ('C',)}
d1
est temporaire defaultdict avec des listes de valeurs, qui seront convertis en n-uplets dans la dernière ligne. De cette façon, vous ajoutez aux listes et de ne pas recréer des tuples dans la boucle principale.d1.iteritems()
. Si vous êtes comme moi, de le modifier pourd1.items()
Cette méthode est relativement efficace et assez compact:
En Python3 cela devient (qui rend les exportations explicite):
Noter que réduire a déménagé à functools et que les lambdas ne plus accepter de n-uplets. Cette version fonctionne encore en 2.6 et 2.7.
À l'aide de listes au lieu de tuples, comme dict valeurs:
Sont les clés déjà triés dans la liste d'entrée? Si c'est le cas, vous avez une solution fonctionnelle:
import operator
, vous pouvez écrireitertools.groupby(sorted(lst), operator.itemgetter(0))