SORU
12 Temmuz 2010, PAZARTESİ


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
13 Temmuz 2010, Salı


@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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • CrazyMan

    CrazyMan

    14 Mayıs 2008
  • TROPFEST

    TROPFEST

    27 Mart 2007