Python-Merge-Dikt
阿神
阿神 2017-06-22 11:52:21
0
2
1018

Jetzt gibt es zwei Diktate. Dieses Diktat hat zwei Ebenen (es wäre besser, wenn die Anzahl der Ebenen angepasst oder unbegrenzt sein könnte), und ich möchte sie zusammenführen

case1:
Eingabe: a: {1: {"171": True}} b: {1: {"172": False}}
Ausgabe: {1: {"171": True, "172": False }}

case2:
Eingabe: a: {1: {"171": True}} b: {1: {"171": False}}
Ausgabe: {1: {"171": False}}

Die dict.update-Methode, die ich in Python verwende, kann nur in einer Ebene verwendet werden. Gibt es eine gute Implementierungsmethode?

阿神
阿神

闭关修行中......

Antworte allen(2)
洪涛

随手写了一个 应对多层 dictionary 的 merge

from itertools import chain
from functools import reduce


def deep_merge_func(acc, item):
    if not acc:
        acc = {}
    k, v = item
    if isinstance(v, dict):
        original_v = acc.get(k)
        if original_v and isinstance(original_v, dict):
            return {**acc, k: deep_merge(original_v, v)}
    return {**acc, k: v}



def deep_merge(origin, target):
    return reduce(deep_merge_func, chain(origin.items(), target.items()), None)


a = {1: {"171": True}}
b = {1: {"171": False}}

print(deep_merge(a, b))


c = {1: {"171": True}}
d = {1: {"172": False}}
print(deep_merge(c ,d))

只测试了 python3.6.1 你只需要调用 deep_merge 就行了

写得比较 functional 不要怪我

代言

对于case2就比较简单:

>>> a={1:{"171": True}}
>>> b={1:{"171":False}}
>>> a.update(b)
>>> a
{1: {'171': False}}

对于case1可以这样操作:

>>> c={}
>>> for k,v in a.items():
...     if k in b:
...         v.update(b[k])
...         c[k] = v
... 
>>> c
{1: {'172': False, '171': True}}

你将上述操作封装为函数即可。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage