Skip to main content
 首页 » 编程设计

Python 查找两个字典是否具有相同的按值划分的键

2025年05月04日16exmyth

执行以下操作的最 Pythonic 方式是什么: 假设我有 2 个字典 A 和 B。现在,字典的常规 python 相等性将检查每个字典中的值和键是否相同,如果这对字典的每个元素都成立,则它们是相等的。如果对于 A 中具有相同值的所有键集,该集合中的每个元素将在 B 中具有相同的值,我想修改它以考虑字典相等,但不一定与 A 中的相同。

示例:

A = {'A':1, 'B':4, 'C':1} 
B = {'A':9, 'B':2, 'C':9} 

此处 A == B。本质上,这个字典代表一组集合,我想在它上面实现集合相等。

我的尝试

def eq(a,b): 
    if not a.keys() == b.keys(): 
        return False 
    for grouping in ({k for k in a.keys() if a[k] == v} for v in a.values()): 
        if not len(set(b[x] for x in grouping)) == 1: 
            return False 
    return True 

我不太喜欢这种方法,因为它不会短路,因为必须消耗整个生成器才能将其转换为集合。这个想法是将第一个集合分成组,这样对于每个组,其中的每个元素都将具有相同的值。然后我想确保对于每个分组,分组元素的值在另一组中是相同的。

编辑 对不起,我无法解释得更清楚,我会举更多的例子。一种更简单的思考方式是:我可以将任何字典转换为一组集合,如下所示:

A = {'A':3, 'B':3, 'C':3, 'R':4, 'T':4} 
A = {{'A', 'B', 'C'}, {'R', 'T'}} 
B = {'A':[], 'B':[], 'C':[], 'R':"", 'T':""} 
B = {{'A', 'B', 'C'}, {'R', 'T'}} 
A == B 

请您参考如下方法:

一些变化,我只能做到:

def eq(a,b): 
    if not a.keys() == b.keys(): 
        return False 
    for x, y in zip(a.values(), b.values()): 
        if not sorted([key for key in a.keys() if a[key] == x]) == sorted([key for key in b.keys() if b[key] == y]): 
            return False 
    return True 

但更简洁一点的是:

def eq(a,b): 
    d1 = {} 
    d2 = {} 
    for (x, y), (i, j) in zip(a.items(), b.items()): 
        d1.setdefault(y, []).append(x) 
        d2.setdefault(j, []).append(i) 
    return [sorted(i) for i in d1.values()] == [sorted(i) for i in d2.values()] 

或更短:

def eq(a,b): 
    d1 = {y: sorted([i for i in a.keys() if a[i] == y]) for x, y in a.items()} 
    d2 = {y: sorted([i for i in b.keys() if b[i] == y]) for x, y in b.items()} 
    return list(d1.values()) == list(d2.values())