Сравните ключ / значения двух словарей и поместите в новый словарь

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

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 =, пожалуйста?

Спасибо

3 ответа

Решение

Вам нужно использовать 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}

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

Я хочу сравнить все пары ключей и значений словаря b с парами c. Если пара ключ-значение отсутствует в 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)

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

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()}

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

И с тех пор c.get(k) возвращает None, если k не существует в с, и None > v автоматически переведет в False.

Другие вопросы по тегам