Подтвердить что ты не робот

Группировка ключей словаря Python в виде списка и создание нового словаря с этим списком в качестве значения

У меня есть словарь python

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

Так как значения в указанном словаре не уникальны. Я хочу сгруппировать все ключи уникальных значений в виде списка и создать новый словарь следующим образом:

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

Обратите внимание, что ключи нового словаря v должны быть отсортированы. Мне сложно визуализировать и реализовать это создание словаря. Пожалуйста, предложите мне простой и эффективный способ сделать это.

4b9b3361

Ответ 1

Использование collections.defaultdict для удобства:

from collections import defaultdict

v = defaultdict(list)

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

но вы можете сделать это и с болотным стандартом dict:

v = {}

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

В Python 3 вместо этого используйте sorted(d.items()).

Ответ 2

Если вам на самом деле не нужен dict в конце дня, вы можете использовать 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))

Конечно, вы можете использовать это для создания диктата, если вы действительно хотите:

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

Но в этот момент вам, вероятно, лучше использовать решение Martijn defaultdict.

Ответ 3

Конструкция сортирует значения и добавляет в новый словарь существующее значение ключа, иначе цикл создает новый ключ:

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]})