Regrouper les clés du dictionnaire Python en tant que liste et créer un nouveau dictionnaire avec cette liste en tant que valeur
J'ai un dictionnaire python
d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1}
Puisque les valeurs dans le dictionnaire ci-dessus ne sont pas uniques. Je veux regrouper toutes les clés de valeurs uniques en tant que liste et créer un nouveau dictionnaire comme suit:
v = {6:[1], 1:[2, 3, 6], 9: [4, 5]}
Remarque les clés du nouveau dictionnaire v doivent être triés. Je trouve difficile de visualiser et d'implémenter cette création de dictionnaire. Veuillez me suggérer un moyen facile et efficace de le faire.
3 réponses
À l'Aide de collections.defaultdict
pour plus de facilité:
from collections import defaultdict
v = defaultdict(list)
for key, value in sorted(d.iteritems()):
v[value].append(key)
Mais vous pouvez le faire avec un standard bog dict
Aussi:
v = {}
for key, value in sorted(d.iteritems()):
v.setdefault(value, []).append(key)
Dans Python 3, Utilisez sorted(d.items())
à la place.
Si vous n'avez pas réellement besoin d'un dict
à la fin de la journée, vous pouvez utiliser itertools.groupby
:
from itertools import groupby
from operator import itemgetter
for k,v in groupby(sorted(d.items()),key=itemgetter(0)):
print k,list(v)
Bien sûr, vous pouvez l'utiliser pour construire un dict si tu voulais vraiment:
{k:list(v) for k,v in groupby(sorted(d.items()),key=itemgetter(0))}
Mais à ce stade, vous feriez probablement mieux d'utiliser la solution defaultdict de Martijn.
Construction trie les valeurs et ajoute dans un nouveau dictionnaire dans une valeur de clé existante, sinon la boucle crée une nouvelle clé:
result = {}
d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1}
for i, j in sorted(d.items(), key=lambda x: x[1]):
if j not in result:
result.update({j: [i]})
else:
result.update({j: result[j] + [i]})