gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:49 24 4
gpt4 key购买 nike

执行以下操作的最 Pythonic 方式是什么:假设我有 2 个字典 AB。现在,字典的常规 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())

关于Python 查找两个字典是否具有相同的按值划分的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56764377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com