根据相似的值对字典进行分组很容易,但是我很难想到一种相反的好方法:对其中一个键的值与其余键不同的字典进行分组。

例如,采取以下措施:

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门控附加项。

10-07 21:38