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.
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.
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.