Сравните ключ / значения двух словарей и поместите в новый словарь
Я знаю, что вариации по этому вопросу уже существуют, но я не могу найти тот, который точно соответствует тому, чего я пытаюсь достичь. У меня есть следующий код, который включает решение, которое я взял из решения аналогичного вопроса:
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.