python merge dict
阿神
阿神 2017-06-22 11:52:21
0
2
953

Kini terdapat dua dict ini mempunyai dua tahap (lebih baik jika bilangan tahap boleh disesuaikan atau tidak terhad), dan saya mahu menggabungkannya

kes1:
Input: a: {1: {"171": Betul}} b: {1: {"172": Salah}}
Output: {1: {"171": Betul, "172": Salah }}

kes2:
Input: a: {1: {"171": Betul}} b: {1: {"171": Salah}}
Output: {1: {"171": Salah}}

Kaedah dict.update yang saya gunakan dalam python hanya boleh digunakan dalam satu lapisan Adakah terdapat kaedah pelaksanaan yang baik?

阿神
阿神

闭关修行中......

membalas semua(2)
洪涛

Saya baru sahaja menulis gabungan yang mengendalikan kamus berbilang lapisan

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))

Hanya python3.6.1 yang diuji, anda hanya perlu memanggil deep_merge

Tulisan lebih berfungsi, jangan salahkan saya

代言

Untuk case2 agak mudah:

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

Untuk kes1 anda boleh melakukan ini:

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

Anda boleh merangkum operasi di atas ke dalam fungsi.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan