2015-09-28 28 views
10

İki sözlükleri var. İkisi arasında hem anahtar hem de değer vermesi gereken farkı bulmam gerek.Nasıl Python iki sözlükleri arasındaki farkı alınır?

Aranan ve DataDiff, dictdiff-efendi gibi bazı eklentiler/paketleri bulundu ancak Python 2.7 bunu denemek zaman tanımlanmış böyle bir modül diyor gelmiş.

Ben burada ayarlanan kullandık.

first_dict = {} 
second_dict = {} 

value = set(second_dict)-set(first_dict) 
print value 

çıkış >>> seti ([ 'SCD-3547', 'SCD-3456'])

ben sadece anahtarı alıyorum, hatta değerlerini almak gerekir. ilgili değerleri alarak bir dict yeniden o zaman tuşların farkını bulmak Yukarıdaki kodda

value = { k : second_dict[k] for k in set(second_dict) - set(first_dict) } 

ve:

+0

da bir fark olmadığını bulmalıyız misiniz: Aynı zamanda bazı güzel Dict anlama Set işlemleri ve python 3.6 tür ek açıklamaları :) sözlüğe değerleri karşılaştırmak istiyorsanız

def get_dict_diffs(a: Dict[str, Any], b: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any], Dict[str, Any]]: added_to_b_dict: Dict[str, Any] = {k: b[k] for k in set(b) - set(a)} removed_from_a_dict: Dict[str, Any] = {k: a[k] for k in set(a) - set(b)} common_dict_a: Dict[str, Any] = {k: a[k] for k in set(a) & set(b)} common_dict_b: Dict[str, Any] = {k: b[k] for k in set(a) & set(b)} return added_to_b_dict, removed_from_a_dict, common_dict_a, common_dict_b 

vurgulamaktadır Anahtarlar aynı, ancak değerleri farklı mı? –

+0

burada "acil" olarak sorularınıza işaretlemek etmeyin - tüm sorular eşit öneme sahiptir. Teşekkürler! – halfer

cevap

19

bir sözlük kavrayışa sahip olma, şu ön deneyin. Bir kümesini kullanarak bakmak haklıydın

+1

teşekkürler u Oscar :) –

+2

Hem 'dict' hem de 'set' hashmaps olduğu için, '' dict'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'metodunu kullanarak neden destekleyemediğini bilmiyorum. – Ray

+1

Bu sadece size ikinci dict olan ancak ilkinde olmayan anahtarlar için dict verir. İlkinde olan ama ikinci sırada olmayan şeylerden ne haber? – henryJack

5

, biz sadece yöntem işe almak için biraz daha derin kazmak gerekir.

Birincisi, örnek kod:

{"foo": "bar", ...} 

Her Sözlük da tamamen farklı bir anahtar değer çifti içerir:

test_1 = {"foo": "bar", "FOO": "BAR"} 
test_2 = {"foo": "bar", "f00": "[email protected]"} 

Biz şu anda her iki sözlükleri de benzer anahtar/değer çiftini içerdiğini görebilirsiniz . Fakat farkı nasıl tespit ederiz? Sözlükler bunu desteklemiyor. Bunun yerine, bir set kullanmak isteyeceksiniz.

set_1 = set(test_1.items()) 
set_2 = set(test_2.items()) 

Bu dizilerini bir dizi içeren bir dizi döndürür: Burada

kullanabileceğimiz bir dizi haline her sözlüğü açmak için nasıl. Her bir tuple, sözlüğünüzden bir anahtar/değer çiftini temsil eder.

print set_1 - set_2 
>>> {('FOO', 'BAR')} 

bir sözlük geri istiyorum: Artık

, set_1 ve set_2 arasındaki farkı bulmak için? Kolay, sadece:

dict(set_1 - set_2) 
>>> {'FOO': 'BAR'} 
9

Ben ki (https://docs.python.org/2/library/sets.html) yapmak kümelerinin simetrik farkı işlemini kullanmak daha iyi olur.

>>> dict1 = {1:'donkey', 2:'chicken', 3:'dog'} 
>>> dict2 = {1:'donkey', 2:'chimpansee', 4:'chicken'} 
>>> set1 = set(dict1.items()) 
>>> set2 = set(dict2.items()) 
>>> set1^set2 
{(2, 'chimpansee'), (4, 'chicken'), (2, 'chicken'), (3, 'dog')} 

Öyle simetrik çünkü:

>>> set2^set1 
{(2, 'chimpansee'), (4, 'chicken'), (2, 'chicken'), (3, 'dog')} 

yönelik olarak ayarlayın çıkan dönüştürmek için iyi bir fikir olmayabilir Ancak fark operatörünü

>>> set1 - set2 
{(2, 'chicken'), (3, 'dog')} 
>>> set2 - set1 
{(2, 'chimpansee'), (4, 'chicken')} 

kullanılırken bu durum böyle değil

>>> dict(set1^set2) 
{2: 'chicken', 3: 'dog', 4: 'chicken'} 
: bir sözlük size bilgi kaybedebilir çünkü
+0

Mükemmel, bu yaklaşık bir yıl önce Raymond Hettinger tarafından önerilen aynı çözümden başka bir forumda: http: //code.activestate.com/recipes/576644-diff-two-dictionaries/#c1 – cscanlin

1

Başka bir çözüm dictdiffer (https://github.com/inveniosoftware/dictdiffer) olur.

import dictdiffer           

a_dict = {             
    'a': 'foo', 
    'b': 'bar', 
    'd': 'barfoo' 
}               

b_dict = {             
    'a': 'foo',            
    'b': 'BAR', 
    'c': 'foobar' 
}               

for diff in list(dictdiffer.diff(a_dict, b_dict)):   
    print diff 

Bir fark değişiklik türüne, değiştirilen değerinin, ve giriş yolu ile bir demet olup.

('change', 'b', ('bar', 'BAR')) 
('add', '', [('c', 'foobar')]) 
('remove', '', [('d', 'barfoo')]) 
0

Bu işlev, yalnızca sözlük anahtarlarına göre tüm farkları (ve aynı kalmayı) sağlar.

values_in_b_not_a_dict = {k : b[k] for k, _ in set(b.items()) - set(a.items())} 
İlgili konular