2012-02-12 2 views
3

Я хочу, чтобы агрегированные числа были заполнены одним словарем и сравнивали как ключи, так и значения с ключами и значениями в другом словаре, чтобы определить различия между ними. Я могу только сделать что-то вроде следующего:Сравнение ключей и значений в 2 словарях

for i in res.keys(): 

    if res2.get(i): 
     print 'match',i 
    else: 
     print i,'does not match' 

for i in res2.keys(): 

    if res.get(i): 
     print 'match',i 
    else: 
     print i,'does not match' 

for i in res.values(): 

    if res2.get(i): 
     print 'match',i 
    else: 
     print i,'does not match' 

for i in res2.values(): 

    if res.get(i): 
     print 'match',i 
    else: 
     print i,'does not match' 

громоздкий и багги ... нужна помощь!

+0

У обоих словарей есть одинаковый набор ключей? –

+0

Вы можете сравнить диктаторы с 'res1 == res2', вам также нужно выяснить, какие * части отличаются? –

+0

'dict.keys' - бесполезная функция,' a.keys() == list (a) ', и явный список ключей вряд ли когда-либо будет полезен. –

ответ

2

Я не уверен, что ваша вторая пара циклов пытается сделать. Возможно, это то, что вы имели в виду под «и багги», потому что они проверяют, что значения в одном dict являются ключами в другом.

Это проверяет, что два диктофона содержат одинаковые значения для одних и тех же клавиш. Построив объединение ключей, вы можете избежать цикла дважды, а затем есть 4 случая для обработки (вместо 8).

for key in set(res.keys()).union(res2.keys()): 
    if key not in res: 
    print "res doesn't contain", key 
    elif key not in res2: 
    print "res2 doesn't contain", key 
    elif res[key] == res2[key]: 
    print "match", key 
    else: 
    print "don't match", key 
1

Я не совсем уверен, что вы имеете в виду путем сопоставления ключей и значений, но это самое простое:

a_not_b_keys = set(a.keys()) - set(b.keys()) 
a_not_b_values = set(a.values()) - set(b.values()) 
+0

Или 'a.viewkeys() - b.viewkeys()' в Python 2.7, 'a.keys() - b.keys()' в Python 3.x. –

+0

Это будет работать, но не будет различать различные пары ключей. Может быть, есть ключ, набор значений? –

+0

словари имеют разные наборы ключей, будет ли это работать? – NewToPy

2

Похоже, с помощью функции набора может работать. Подобно Ned Batchelder:

fruit_available = {'apples': 25, 'oranges': 0, 'mango': 12, 'pineapple': 0 } 

my_satchel = {'apples': 1, 'oranges': 0, 'kiwi': 13 } 

available = set(fruit_available.keys()) 
satchel = set(my_satchel.keys()) 

# fruit not in your satchel, but that is available 
print available.difference(satchel) 
+0

намного проще! большое спасибо! – NewToPy

+0

Я сравниваю различия как в ключах, так и в значениях, поэтому решил принять ваш совет и внести изменения, чтобы использовать iteritems следующим образом: 'available = set (fruit_available.iteritems())' 'satchel = set (my_satchel.iteritems()) '' print available.difference (satchel), satchel.difference (доступно) ' – NewToPy

+0

обратите внимание также, что набор (fruit_available.keys()) эквивалентен (и, возможно, более ясен), чем установлен (fruit_available) –

Смежные вопросы