2015-01-11 2 views
-1

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

b = {"1":0,"2":0,"3":0,"4":0,"5":0} 
c = {"1":1,"4":4,"5":5} 

d = [k for k in b if c.get(k, object()) > b[k]] 

print d 

То, что я хочу, чтобы сравнить все ключевые и пары значений словаря b с теми c. Если пара ключей и значений отсутствует в c, то значение ключа/пары b сохраняется в словаре d, иначе значения в c сохраняются в d.

В приведенном выше примере d должен выглядеть следующим образом:

d = {"1":1,"2":0,"3":0,"4":4,"5":5} 

Может кто-нибудь сказать мне правильный синтаксис, что нужно для линии d =, пожалуйста?

Благодаря

+1

код вы вывесили сравнивает значение 'c [k]' с 'b [k]', но ваше описание относится только к текущему или отсутствующему, а не «использовать значение в' c', если оно больше ».Что вы хотите, если 'c [" 4 "] == -6'? – DSM

ответ

0

Вы должны использовать if-else условие в вашем понимании, а также вам не нужно использовать get когда каждая вещь ясна:

>>> d={k:c[k] if k in c and c[k]>b[k] else v for k,v in b.items()} 
>>> d 
{'1': 1, '3': 0, '2': 0, '5': 5, '4': 4} 
0

Или, возможно, это:

b = {"1":0,"2":0,"3":0,"4":0,"5":0} 
c = {"1":1,"4":4,"5":5} 

d = {k:b[k] if not c.get(k)>b[k] else c[k] for k in b} 

d 
{'1': 1, '2': 0, '3': 0, '4': 4, '5': 5} 

Или, если вы хотите распаковать оба ключа/значения от b для сравнения:

{k:v if not c.get(k)>v else c[k] for k, v in b.iteritems()} 

Часть к: v рассматривается как key=k и value=v только если k не существует в c и c[k] значение >v, в противном случае принимают v.

И так c.get(k) возвращает None если k не существует в C, и None > v будет автоматически переводить Ложный.

2

Чтобы ответить на ваш фактический вопрос

То, что я хочу, чтобы сравнить все ключевые и пары значений словаря б с теми с. Если пара ключей и значений отсутствует в c, то значение ключа/пары b сохраняется в словаре d, иначе значения в c сохраняются в d.

>>> b = {"1":0,"2":0,"3":0,"4":0,"5":0} 
>>> c = {"1":1,"4":4,"5":5} 
>>> d = {k: c.get(k, b[k]) for k in b} 
>>> d 
{'1': 1, '3': 0, '2': 0, '5': 5, '4': 4} 

В Python 3 следует использовать collections.ChainMap (обратите внимание, что это немного отличается тем, что он будет принимать какие-либо ключ от c, а не только те, в b)

>>> from collections import ChainMap 
>>> b = {"1":0,"2":0,"3":0,"4":0,"5":0} 
>>> c = {"1":1,"4":4,"5":5} 
>>> d = ChainMap(c, b) 
>>> d 
ChainMap({'1': 1, '5': 5, '4': 4}, {'1': 0, '3': 0, '2': 0, '5': 0, '4': 0}) 
>>> d['1'], d['2'], d['4'] 
(1, 0, 4)