根据相似的值对字典进行分组很容易,但是我很难想到一种相反的好方法:对其中一个键的值与其余键不同的字典进行分组。
例如,采取以下措施:
a = {1: 'a', 2: 'b', 3:'c'}
b = {1: 'a', 2: 'b', 3:'d'}
c = {1: 'c', 2: 'b', 3:'d'}
这些可以分为两个不同的集合,其中一个键值不同:
# Expected output:
{3: {a, b}, # Differs on 3
1: {b, c}} # Differs on 1
我很难想到实现这种功能的好方法。您对前进的方式有什么建议吗?
最佳答案
假设键和值是可哈希的,则可以通过使用项上的集合来获得字典差异。然后,您可以获得字典对的列表,以及它们之间的区别是:
a = {1: 'a', 2: 'b', 3:'c'}
b = {1: 'a', 2: 'b', 3:'d'}
c = {1: 'c', 2: 'b', 3:'d'}
def diff_dict(dicta, dictb):
aset = set(dicta.items())
bset = set(dictb.items())
diff = aset ^ bset
return tuple(set(x[0] for x in diff))
print diff_dict(a, b)
(3,)
all_dicts = [a,b,c]
listgroup = []
for dicta, dictb in itertools.combinations(all_dicts, 2):
key = diff_dict(dicta, dictb)
listgroup.append((key, (dicta, dictb)))
如果只需要单个项目,请用
if len(key) == 1
门控附加项。