在两个字典之间进行映射的Pythonic方法,其中一个具有嵌套键

时间:2018-12-12 10:35:27

标签: python

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

例如: 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中是否有更好,更快的方法

1 个答案:

答案 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
相关问题