所以我想要一种方法来比较d1和d2
d1=
{"tables":
{"k1":
{"columns":
["val1","val2","val3"]
},
"forward":
{"k2":
["val1","val2","val3"]
}
}
}
d2=
{"tables":
{"k1":
{"columns":
["val2","val1","val3"]
},
"forward":
{"k2":
["val2","val1","val3"]
}
}
}
并且相等。这两个列表字典来自不同的来源,我想要最简单的解决方案。我确信这是微不足道的,但我现在已经陷入困境。
EDIT1: 显然你理解我的问题。这正是我的意思。这些列表不相同,并且在有一个与列表对应的密钥集之前,我事先并不知道它们是列表或者有多少字典。这些来自json字符串,所以字典不区分列表和集合(我猜...)
答案 0 :(得分:3)
如果您不关心字典结构中任何 list
的顺序,您可以递归地将它们全部转换为无序的set
数据结构:
def lists_to_sets(d):
for k, v in d.items():
if isinstance(v, list):
d[k] = set(v)
elif isinstance(v, dict):
lists_to_sets(v)
这假设列表包含可清除对象 - 如果它们包含例如dict
这不起作用。在行动:
>>> d1 = {"tables": {"k1": {"columns": ["val1", "val2", "val3"]},
"forward": {"k2": ["val1", "val2", "val3"]}}}
>>> d2 = {"tables": {"k1": {"columns": ["val2", "val1", "val3"]},
"forward": {"k2": ["val2", "val1", "val3"]}}}
>>> d1 == d2
False
>>> lists_to_sets(d1)
>>> lists_to_sets(d2)
>>> d1 == d2
True