Değişen derinliği iç içe bir sözlüğü güncelleştirmek değer
Bir şekilde dict güncelleme wihout üzerine levelA içeriğiyle dict dictionary1 güncellemek için arıyorum
dictionary1={'level1':{'level2':{'levelA':0,'levelB':1}}}
update={'level1':{'level2':{'levelB':10}}}
dictionary1.update(update)
print dictionary1
{'level1': {'level2': {'levelB': 10}}}
Bu güncelleme en düşük anahtar level1 güncelleme çünkü seviye 2 değerleri siler biliyorum.
Nasıl bu, dictionary1 ve güncelleme herhangi bir uzunlukta olabilir verilen mücadele edebilir miyim?
CEVAP
@Fm'in cevap hakkı genel bir fikir vardır, yani, özyinelemeli bir çözüm, ama biraz tuhaf ve en az bir hata kodlama. Yerine tavsiye ederim:
import collections
def update(d, u):
for k, v in u.iteritems():
if isinstance(v, collections.Mapping):
r = update(d.get(k, {}), v)
d[k] = r
else:
d[k] = u[k]
return d
Hata geldiğinde "update" k, v maddenin nereye gidiyorsunuz bir dict ve k değildir aslında bir anahtar sözlük güncellendiği -- @FM kodu "atlar" olarak bu yeni güncelleme (çünkü gerçekleştirir üzerinde boş bir yeni dict olan değil kaydedilmiş veya geri herhangi bir yerde, kaybolmuş zaman özyinelemeli Ara verir).
Benim diğer değişiklikler küçük: hiçbir nedenle eğer/else yapısı oluştururken .get
yaptığı aynı işi daha hızlı ve daha temiz, ve isinstance
en iyi uygulanan soyut temel sınıflar (beton olanlar) için genellik.
Yeni Ekle veya varolan bir maddeyi gün...
Nasıl null değer sütunu güncelleştirme...
/Örneğini doldurmak için nasıl bir C# ...
Kontrol JSON dize döndürülen bir Objec...
Veri çerçevesi, bir koşullu dayalı bir...