2013-04-30 2 views
1

У меня есть словарь, как показано нижеНайти же словарь по значению

dict1 = {'a':{'a':20, 'b':30}, 'b':{'a':30, 'b':40}, 'c':{'a':20, 'b':30}, 'd':{'a':30, 'b':40}} 

Тогда в следующем словаре два словарей совпадают, поэтому ожидаемый результат будет как ниже

result = [['a','c'],['b','d']] 
+0

Что вы хотите, если есть несколько папок вложенных словарей с одинаковыми значениями? – ASGM

+0

Я обновил свой вопрос – user1576199

+5

Почему вы так сильно изменили ожидаемый результат? – eumiro

ответ

4
>>> seen = {} 
>>> dict1 = {'a':{'a':20, 'b':30}, 'b':{'a':30, 'b':40}, 'c':{'a':20, 'b':30}, 'd':{'a':30, 'b':40}} 
>>> for k in dict1: 
     fs = frozenset(dict1[k].items()) 
     seen.setdefault(fs, []).append(k) 


>>> seen.values() # note: unordered 
[['a', 'c'], ['b', 'd']] 

Если нужен заказ :

>>> from collections import OrderedDict 
>>> dict1 = {'a':{'a':20, 'b':30}, 'b':{'a':30, 'b':40}, 'c':{'a':20, 'b':30}, 'd':{'a':30, 'b':40}} 
>>> seen = OrderedDict() 
>>> for k in sorted(dict1): 
     fs = frozenset(dict1[k].items()) 
     seen.setdefault(fs, []).append(k) 


>>> seen.values() 
[['a', 'c'], ['b', 'd']] 

Примечание: Этот код в настоящее время является кросс-совместимым на Python 2/3. На Python 2 вы можете сделать его более эффективным, используя .iteritems() вместо .items()

+1

+1 - Идеальный ответ для текущей версии вопроса. – eumiro

0

Быстрый: 1-й получить разные значения, а затем составить список.

>>> values = [] 
>>> for k in dict1: 
    if dict1[k] not in values: 
     values.append(dict1[k]) 


>>> values 
[{'a': 20, 'b': 30}, {'a': 30, 'b': 40}] 
>>> [[k for k in dict1 if dict1[k] == v] for v in values] 
[['a', 'c'], ['b', 'd']] 
Смежные вопросы