用一个有嵌套键的dict在两个dict之间映射的Pythonic方法

2024-10-03 11:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两种表示相同数据的dict。它们被两个不同的通道使用,因此它们的键是不同的。你知道吗

例如: 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中有没有更好更快的方法来实现这一点


Tags: 数据类型dictkey2key1value1key3value2
1条回答
网友
1楼 · 发布于 2024-10-03 11:23:01

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

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

相关问题 更多 >