2013-12-14 57 views
1

我是python字典以及嵌套的新手。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}} 

我需要找到一种方法,每个OBJ文件的相互比较和创建所有匹配的那些的嵌套列表。所以,如果OBJ1和OBJ4比赛,和OBJ 2 & 3的比赛,我想这是我的结果:

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

我怎么会去这样做呢?

回答

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

你要做的是创建等价类的值。

通常,这很容易:只需扭转字典成multidict(一个字典,其值是一组或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)