Grzegorz Brzęczyszczykiewicz rašė:
> yra N lygmenų dict(), kurio tik N+1 -ame lygmenyje visada yra list()
>
> Duomenys ateina iš išorinės sistemos ir nauji duomenys gali atsidurti
> bet kuriame lygmenyje. Leaf'o elementai turi būti unikalūs, bet tai
> sprendžiama per list(set()).
> Ar Python turi standartine priemones apjungti tokias struktūras?
>
> Pvz:
> a = {'a': {'b':['cc','dd']}}
> b = {'a': {'b':['c','dd']}, 'b': {'b':['cc','dd']}}
> ->
> {'a': {'b':['c', 'cc','dd']}, 'b': {'b':['cc','dd']}}
>
> Dabar sprendžįau rekursiškai, pripjoviau grybo ir matau tik paskutinę
> paduotą medžio struktūrą. Ir šiaip kodas baisus gavos :)
Gal irgi baisus kodas, bet...(kind of works):
def merge_dicts(dic1, dic2, skey = ''):
res = {}
for key in dic1:
skey += '.' + key
if type(dic1[key]) is dict:
#print("{0} is dict".format(skey))
if key in dic2:
res[key] = merge_dicts(dic1[key], dic2[key], skey)
else:
res[key] = dic1[key]
elif type(dic1[key]) is list:
#print("{0} is list".format(skey))
if key in dic2:
if type(dic2[key]) is not list:
raise Exception("Different types: " + skey)
res[key] = list(set(dic1[key] + dic2[key]))
else:
res[key] = dic1[key]
for key in dic2:
if key not in dic1:
res[key] = dic2[key]
return res
