web-dev-qa-db-fra.com

Regroupement Python clés de dictionnaire sous forme de liste et créer un nouveau dictionnaire avec cette liste comme valeur

J'ai un dictionnaire python

d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1}

Étant donné que les valeurs dans le dictionnaire ci-dessus ne sont pas uniques. Je veux regrouper toutes les clés de valeurs uniques sous forme de liste et créer un nouveau dictionnaire comme suit:

v = {6:[1], 1:[2, 3, 6], 9: [4, 5]}

Notez que les clés du nouveau dictionnaire v doivent être triées. J'ai du mal à visualiser et à mettre en œuvre cette création de dictionnaire. Veuillez me suggérer un moyen simple et efficace de le faire.

33
Shankar

Utiliser 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 aussi le faire avec un dict standard:

v = {}

for key, value in sorted(d.iteritems()):
    v.setdefault(value, []).append(key)

Dans Python 3, utilisez sorted(d.items()) à la place.

55
Martijn Pieters

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(1)), itemgetter(1) ):
    print k,list(map(itemgetter(0),v))

Bien sûr, vous pouvez l'utiliser pour construire un dict si vous voulez vraiment:

{k:list(map(itemgetter(0),v)) for k,v in groupby( sorted(d.items(),key=itemgetter(1)), itemgetter(1) )}

Mais à ce stade, vous feriez probablement mieux d'utiliser la solution defaultdict de Martijn.

14
mgilson