Разделите значения двух словарей в python

У меня есть два словаря с одинаковыми ключами, и я хотел бы разделить значения для обновления или создания нового словаря, сохраняя ключи нетронутыми, с частным в качестве нового значения для каждого из ключей.

d1 = { 'a':12 , 'b':10 , 'c':2 }
d2 = { 'a':0 , 'c':2 , 'b':5}
d3 = d2 / d1

d3 = { 'a':0 , 'b':0.5 , 'c':1 }

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


person ktflghm    schedule 07.08.2012    source источник


Ответы (4)


Использование ключей просмотра (python2.7):

{k: float(d2[k])/d1[k] for k in d1.viewkeys() & d2}

То же самое в python 3 (где мы можем вообще отказаться от вызова float()):

{k: d2[k]/d1[k] for k in d1.keys() & d2}

Да, здесь я использую ключевой перекресток; если вы абсолютно уверены, что ваши ключи одинаковы в обоих, просто используйте d2:

{k: float(d2[k])/d1[k] for k in d2}

И, чтобы быть полным, в Python 2.6 и ранее вам нужно будет использовать конструктор dict() с выражением генератора, чтобы добиться того же:

dict((k, float(d2[k])/d1[k]) for k in d2)

который генерирует последовательность кортежей ключ-значение.

person Martijn Pieters    schedule 07.08.2012
comment
пересечение ключей не требуется, OP утверждает, что 2 словаря имеют одинаковые ключи - person jamylak; 07.08.2012
comment
@jamylak: лучше перестраховаться, чем потом сожалеть? :-П - person Martijn Pieters; 07.08.2012
comment
Просто отметим, что вызов float не нужен в Python 3 и что d1.keys() & d2.keys() можно записать как d1.keys() & d2. - person vaultah; 05.12.2016
comment
@vaultah: ах, да, конечно. Вызов d2.viewkeys() также не нужен. - person Martijn Pieters; 05.12.2016

Это работает для всех питонов, однако я бы порекомендовал решение @MartijnPieters, если у вас есть Py 2.7+

>>> d1 = { 'a':12 , 'b':10 , 'c':2 }
>>> d2 = { 'a':0 , 'c':2 , 'b':5}
>>> d3 = dict((k, float(d2[k]) / d1[k]) for k in d2)
>>> d3
{'a': 0.0, 'c': 1.0, 'b': 0.5}
person jamylak    schedule 07.08.2012

d1 = { 'a':12 , 'b':10 , 'c':2 }
d2 = { 'a':0 , 'c':2 , 'b':5}
d3={x:float(d2[x])/d1[x] for x in d1}
print d3

вывод:

{'a': 0.0, 'c': 1.0, 'b': 0.5}
person Ashwini Chaudhary    schedule 07.08.2012
comment
@Thrustmaster: это называется пониманием словаря; введено в Python 2.7: PEP 274. - person Martijn Pieters; 07.08.2012
comment
@MartijnPieters: Потрясающе! Спасибо :) - person UltraInstinct; 07.08.2012

в 3.2 вы используете метод .keys() и .get(key). http://www.tutorialspoint.com/python/python_dictionary.htm

person AlexLordThorsen    schedule 07.08.2012
comment
.get(key) возвращает None, если ключ не определен. Хотя это всегда будет, если вы зациклитесь на .keys(), это означает, что .get(key) медленнее, чем простой доступ к элементу (d1[key]). - person Martijn Pieters; 07.08.2012