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

时间:2013-12-14 01:49:22

标签: 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': (1,0,0), 'height': 10.6}}

我需要找到一种方法来比较每个objs并创建一个匹配的所有objs的嵌套列表。所以如果obj1和obj4匹配,那么obj2& 3匹配,我希望这是我的结果:

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

我将如何做到这一点?

2 个答案:

答案 0 :(得分:1)

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

通常情况下,这很简单:只需将dict转换为multidict(一个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)

答案 1 :(得分:1)

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]