python:在嵌套字典中查找匹配值

python:在嵌套字典中查找匹配值,python,dictionary,nested,Python,Dictionary,Nested,我不熟悉python字典和嵌套 这就是我想要找到的——我有所有具有相同属性的对象:颜色和高度。我需要比较所有属性,并列出所有匹配的属性 matchList = [] dict = {obj1:{'color': (1,0,0), 'height': 10.6}, obj2:{'color': (1,0.5,0), 'height': 5}, obj3:{'color': (1,0.5,0), 'height': 5}, obj4:{'color'

我不熟悉python字典和嵌套

这就是我想要找到的——我有所有具有相同属性的对象:颜色和高度。我需要比较所有属性,并列出所有匹配的属性

matchList = []
dict = {obj1:{'color': (1,0,0), 'height': 10.6},
        obj2:{'color': (1,0.5,0), 'height': 5},
        obj3:{'color': (1,0.5,0), 'height': 5}, 
        obj4:{'color': (1,0,0), 'height': 10.6}}
我需要找到一种方法来比较每个对象,并创建一个包含所有匹配对象的嵌套列表。因此,如果obj1和obj4匹配,obj2和3匹配,我希望这是我的结果:

matchList = [[obj1, obj4], [obj2, obj3]]

我该怎么做呢?

您要做的是创建值的等价类

通常,这很容易:只要将dict反转为一个多dict(其值为0或更多实际值的集合或列表),然后每个集合或列表的值都是一个等价类:

original_dict = {'a': 1, 'b': 2, 'c': 1, 'd': 2}

from collections import defaultdict
reverse_multidict = defaultdict(list)
for key, value in original_dict.items():
    reverse_multidict[value].append(key)

matchList = list(reverse_multidict.values()) # leave out the list() in 2.x
但是,在您的情况下,这些值是
dict
s,这意味着它们不能用作
dict
中的键

最简单的方法是将每个
dict
转换为不可变和可散列的内容,如键值元组的元组:

for key, value in original_dict.items():
    reverse_multidict[tuple(value.items())].append(key)

dict
引用内置的Python字典类,因此最好不要重写它

在以下示例中,我已将字典重命名为
objs

import itertools as it
keys = sorted(objs.keys(), key=lambda k: objs[k]) # Make sure `objs` with the same value be arranged next to each other
groups = it.groupby(keys, lambda k: d[k]) # so that we can group them by value
match_list = [list(keys) for v, keys in groups]

本例中的
d
是什么?