Python:更新subdicts的简洁方法?

时间:2018-02-06 19:32:47

标签: python

假设我们有这两个词典:

a = {"A": "MyText", "B": {"Sub": "Hello", "NextSub": "Bye"}}
b = {"B": {"NextSub": 55}}

如何将它们合并在一起以便我得到这个结果(这样它可以用于每种类型的字典)?

ab = {"A": "MyText", "B": {"Sub": "Hello", "NextSub": 55}}

a.update(b)只是替换“B”。

我想合并一些dicts,因为我需要处理所有这些。因此,如果我处理一个包含所有dicts的最新信息而不是在for循环中处理更多dicts的合并dict,它会更快。

谢谢!

1 个答案:

答案 0 :(得分:1)

对于通用解决方案,您可以使用递归:

l = [[{"A": "MyText", "B": {"Sub": "Hello", "NextSub": "Bye"}},{"B": {"NextSub": 55}}], [{"a": {"a": {"a": 2, "b": "bye"}}}, {"a": {"a": {"a": "Hello"}}}]]
def update(a, b):
   if len(a) == len(b):
      return {c:d if not isinstance(d, dict) else {**d, **h} if c == e and all(not isinstance(i, dict) for _, i in d.items()) else update(d, h) for [c, d], [e, h] in zip(a.items(), b.items())}
   return {c:d if not isinstance(d, dict) else {**d, **b[c]} if all(not isinstance(i, dict) for _, i in d.items()) else update(d, b) for c, d in a.items()}

results = [update(*i) for i in l]

输出:

[{'A': 'MyText', 'B': {'Sub': 'Hello', 'NextSub': 55}}, {'a': {'a': {'a': 'Hello', 'b': 'bye'}}}]