Rumah > Soal Jawab > teks badan
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?
PHP中文网2017-06-22 11:54:21
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
代言2017-06-22 11:54:21
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.