我想合并两个字典A和B,知道这两个字典以前的共同状态C。我需要合并也发生在子字典。如果是真正的冲突,我需要提出一个例外。在
1-在下面的示例中,merge方法应该理解A和B编辑了不同的项,因此merge不应该引发冲突
C = {"x": 0, "y": 0}
A = {"x": 1, "y": 0} # Edit x, but not y
B = {"x": 0, "y": 1} # Edit y, but not x
# merge(A, B, C) => {"x": 1, "y": 1}
2-该功能需要能够处理新项目和已删除项目
^{pr2}$3-当实际冲突发生时,函数应引发异常
C = {"x": 0}
A = {"x": 1} # Edit x
B = {"x": 2} # Also edit x
# merge(A, B, C) => raise Exception
C = {"x": 0}
A = {"x": 1} # Edit x
B = {} # Delete x
# merge(A, B, C) => raise Exception
4-函数应该递归地工作
C = {"deeper": {"x": 0, "y": 0}}
A = {"deeper": {"x": 1, "y": 0}} # Edit deeper["x"], but not deeper["y"]
B = {"deeper": {"x": 0, "y": 1}} # Edit deeper["y"], but not deeper["x"]
# merge(A, B, C) => {"deeper": {"x": 1, "y": 1}}
实现这种合并功能的最佳方法是什么?在
尝试一个递归检查用例的函数,如果没有一个满足,则会失败(引发valueerror)。在
我相信这能满足你的要求
您可以将所有dict项转换为集合,使用从对称差异到C的键的交集来查找冲突,并使用3个集合的交集(公共项)和差分到C的并集来获得合并。递归地合并A、B和C共有的子字典,将子字典转换为项对的元组,使它们能够散列并转换为集合,然后在合并后将它们转换回dict。在
编辑:如果dict值是不易损坏的对象(如set),则必须先序列化这些值(我建议使用
pickle
作为序列化程序,因为它有Python的本机支持),然后才能将dict项转换为集合,并在合并后反序列化它们:因此:
^{pr2}$将输出:
同时:
会引起:
以及:
会引起:
相关问题 更多 >
编程相关推荐