2013-04-30 31 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 2013-04-30 10:27:40

+0

我已更新我的問題 – user1576199 2013-04-30 10:33:02

+5

您爲什麼如此劇烈地改變預期輸出? – eumiro 2013-04-30 10:33:10

回答

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 2013-04-30 10:47:10

0

快速:第一個獲取不同的值,然後列出理解。

>>> 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']]