在两个dict之间映射的python方法,其中一个dict具有嵌套键

在两个dict之间映射的python方法,其中一个dict具有嵌套键,python,Python,我有两种表示相同数据的dict。它们被两个不同的通道使用,因此它们的密钥不同 例如: A型 B型 { "equiKey1": "value1", "equiKey2": "value2", "equinestedKey1.key3" : "value3", "equinestedKey1.key4" : "value4" } 我想将数据从类型B映射到类型A。 目前我正在创建它如下 { "key1": typeBObj.get("equiKey1"), ..... }

我有两种表示相同数据的dict。它们被两个不同的通道使用,因此它们的密钥不同

例如: A型

B型

{ 
  "equiKey1": "value1",
  "equiKey2": "value2",
  "equinestedKey1.key3" : "value3",
  "equinestedKey1.key4" : "value4"
}
我想将数据从类型B映射到类型A。 目前我正在创建它如下

{
  "key1": typeBObj.get("equiKey1"),
   .....
}

在Python中有更好更快的方法吗首先,您需要一个字典将
B
中的键映射到
a
中的键(或者更确切地说是键列表)。(如果键遵循问题的模式或类似模式,则也可能生成此dict。)

然后您可以定义一个用于转换这些键的函数

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

因此,您想从键中去掉前导的
“equi”
,并将它们放置在类型A中相同的相对位置?键名仅用于演示。这些可能是任何东西。我使用了“equi”作为等价键的缩写,我个人会在递归函数中使用它,跟踪嵌套路径,并用它检查
B
。可能是一些更快的方法,但如果你喜欢,我认为在任何人都能给出有用的答案之前,这个问题需要不那么模棱两可。也许您需要的完整输出可以澄清问题?
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
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