我是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]]
我将如何做到这一点?
答案 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]