我有两种表示相同数据的字典。它们由两个不同的通道使用,因此它们的密钥是不同的。
例如: A
{
"key1": "value1",
"key2": "value2",
"nestedKey1" : {
"key3" : "value3",
"key4" : "value4"
}
}
B型
{
"equiKey1": "value1",
"equiKey2": "value2",
"equinestedKey1.key3" : "value3",
"equinestedKey1.key4" : "value4"
}
我想将数据从类型B映射到类型A。 目前,我正在按以下方式创建它
{
"key1": typeBObj.get("equiKey1"),
.....
}
在Python中是否有更好,更快的方法
答案 0 :(得分:1)
首先,您需要一个字典,将B
中的键映射到A
中的键(或键列表)。 (如果键遵循您问题的模式或类似模式,则可能还会生成此字典。)
B_to_A = {
"equiKey1": ["key1"],
"equiKey2": ["key2"],
"equinestedKey1.key3" : ["nestedKey1", "key3"],
"equinestedKey1.key4" : ["nestedKey1", "key4"]
}
然后,您可以定义翻译这些键的功能。
def map_B_to_A(d):
res = {}
for key, val in B.items():
r = res
*head, last = B_to_A[key]
for k in head:
r = res.setdefault(k, {})
r[last] = val
return res
print(map_B_to_A(B) == A) # True
使用reduce
,或更短一些,但可能不太清晰:
def map_B_to_A(d):
res = {}
for key, val in B.items():
*head, last = B_to_A[key]
reduce(lambda d, k: d.setdefault(k, {}), head, res)[last] = val
return res