SORU
22 Temmuz 2009, ÇARŞAMBA


Anahtarları iki Python sözlüklerinde bulunan hesaplayın farkı

İki Python sözlükler - dictA dictB var sanırım. Eğer dictB mevcut olan ama herhangi bir anahtar olup olmadığını öğrenmek için dictA ihtiyacım var. Bu konuda gitmek için en hızlı yolu nedir?

Set halinde sözlük anahtarlarını dönüştürmek gerekiyor gerekiyor mu?

Düşüncelerinizi bilmek...


Cevaplar için teşekkürler.

Benim sorum belirten için özür dilerim düzgün. Benim senaryo böyle bir sistem dictA hangi olabilir gibi dictB ya da bazı tuşları eksik olarak göre dictB yoksa değeri bazı tuşlar olabilir farklı edilmek zorunda ayarlamak için bu dictA anahtar değeri.

Sorun sözlüğün standart ve dict in dict olan değerleri alabilir.

Demek

dictA={'key1':a, 'key2':b, 'key3':{'key11':cc, 'key12':dd}, 'key4':{'key111':{....}}}
dictB={'key1':a, 'key2:':newb, 'key3':{'key11':cc, 'key12':newdd, 'key13':ee}.......

'Key2' değeri yeni değere ve 'key13' dict içinde eklenmelidir.olmalı Anahtar değeri sabit bir biçime sahip değil. Basit bir değer veya dict ya da dict bir dict olabilir.

CEVAP
22 Temmuz 2009, ÇARŞAMBA


Anahtarları üzerinde küme işlemleri kullanabilirsiniz:

diff = set(dictb.keys()) - set(dicta.keys())

İşte tüm olasılıklar bulmak için bir sınıf:-değeri anahtar çiftleri aynı olan ve-değeri anahtar çiftleri değiştirildi kaldırıldı ne ekledi, ne oldu.

class DictDiffer(object):
    """
    Calculate the difference between two dictionaries as:
    (1) items added
    (2) items removed
    (3) keys same in both but changed values
    (4) keys same in both and unchanged values
    """
    def __init__(self, current_dict, past_dict):
        self.current_dict, self.past_dict = current_dict, past_dict
        self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
        self.intersect = self.set_current.intersection(self.set_past)
    def added(self):
        return self.set_current - self.intersect 
    def removed(self):
        return self.set_past - self.intersect 
    def changed(self):
        return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
    def unchanged(self):
        return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])

İşte bazı örnek çıktı:

>>> a = {'a': 1, 'b': 1, 'c': 0}
>>> b = {'a': 1, 'b': 2, 'd': 0}
>>> d = DictDiffer(b, a)
>>> print "Added:", d.added()
Added: set(['d'])
>>> print "Removed:", d.removed()
Removed: set(['c'])
>>> print "Changed:", d.changed()
Changed: set(['b'])
>>> print "Unchanged:", d.unchanged()
Unchanged: set(['a'])

Bir github repo olarak kullanılabilir: https://github.com/hughdbrown/dictdiffer

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • hanksranger

    hanksranger

    6 EKİM 2009