Найти все ключевые элементы с одинаковым значением в Dicts - PullRequest
10 голосов
/ 04 февраля 2011

У меня вопрос по словарям в Python.

вот оно:

У меня есть что-то вроде dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' }

Теперь я хочу получить все ключевые элементы с одинаковым значением и сохранить их в новом формате.

Новый Dict должен выглядеть следующим образом:

new_dict = { 'b':('cdf'), 'a':('abc','gh'), 'g':('fh','hfz')}

Ответы [ 3 ]

21 голосов
/ 04 февраля 2011

Если у вас все в порядке со списками вместо кортежей в новом словаре, вы можете использовать

from collections import defaultdict
some_dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' }
new_dict = defaultdict(list)
for k, v in some_dict.iteritems():
    new_dict[v].append(k)

Если вы хотите избежать использования defaultdict, вы можете также сделать

new_dict = {}
for k, v in some_dict.iteritems():
    new_dict.setdefault(v, []).append(k)
2 голосов
/ 04 февраля 2011

Вот наивная реализация.Кто-то с лучшими навыками Python, вероятно, может сделать его более кратким и удивительным.

dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' }

new_dict = {}
for pair in dict.items():
    if pair[1] not in new_dict.keys():
        new_dict[pair[1]] = []

    new_dict[pair[1]].append(pair[0])

print new_dict

Это производит

{'a': ['abc', 'gh'], 'b': ['cdf'], 'g': ['fh', 'hfz']}
0 голосов
/ 30 октября 2017

Если вы действительно хотите использовать кортежи в качестве значений в новом словаре, вы все равно можете использовать defaultdict и использовать конкатенацию кортежей.Это решение работает в Python 3.4 +:

from collections import defaultdict

source = {'abc': 'a', 'cdf': 'b', 'gh': 'a', 'fh': 'g', 'hfz': 'g'}
target = defaultdict(tuple)

for key in source:
    target[source[key]] += (key, )

print(target)

, которое будет производить

defaultdict(<class 'tuple'>, {'a': ('abc', 'gh'), 'g': ('fh', 'hfz'), 'b': ('cdf',)})

Это, вероятно, будет медленнее, чем создание словаря путем вставки списка, и создаст больше объектов для сбора,Таким образом, вы можете построить свой словарь из списков, а затем отобразить его в кортежи:

target2 = defaultdict(list)

for key in source:
    target2[source[key]].append(key)

for key in target2:
    target2[key] = tuple(target2[key])

print(target2)

, что даст тот же результат, что и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...