Группировка ключей словаря 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 должны быть отсортированы. Мне сложно визуализировать и реализовать это создание словаря. Пожалуйста, предложите мне простой и эффективный способ сделать это.
Ответы
Ответ 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]})