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.

25
demandé sur Shankar 2013-04-02 01:12:02

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.

40
répondu Martijn Pieters 2013-04-01 21:19:31

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.

12
répondu mgilson 2013-04-01 21:24:09

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]})
-1
répondu Frank 2017-02-21 18:44:33