Перемножение значений словарей с разными ключами

Проблему перемножения значений двух словарей с одинаковыми ключами я решил следующим образом:

v1={'name1': '10', 'name2': '20'}
v2={'name1': '4', 'name2': '5'}

foo = lambda dct_1, dct_2: {key: int(dct_2[key]) * int(dct_1[key]) for key in dct_2}

foo(v1, v2)
# Out: {'name1': 40, 'name2': 100}

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

v1={'name1': '10', 'name2': '20'}
v2={'quantity1': '4', 'quantity2': '5'}

#OUT: {'name1':'40', 'name2': '100'}

person Yaroslav    schedule 03.10.2017    source источник
comment
имя ключа от каждого dict содержит один и тот же номер?   -  person Dadep    schedule 03.10.2017
comment
Будь очень осторожен. Словари не упорядочены, так как же узнать, какие элементы нужно перемножить. Вместо этого рассмотрите возможность использования collections.OrderedDict.   -  person Stuart Buckingham    schedule 03.10.2017
comment
Привет! Я просто придумал пример. В этом примере да. А вообще в этом примере я хотел подчеркнуть, что разные названия ключей. Спасибо за ваш комментарий   -  person Yaroslav    schedule 03.10.2017


Ответы (4)


Предполагая, что у вас всегда есть соответствующие значения nameX и quantityX, вы можете использовать простую замену ключей:

foo = lambda dct_1, dct_2: {key: int(dct_2[key.replace('name', 'quantity')]) * int(dct_1[key]) for key in dct_1}
person Mureinik    schedule 03.10.2017

multiplydicts = lambda x,y: { key: str(int(v1[key]) * int(val)) for key,val in zip(v1.keys(), v2.values())}

Предполагая, что ваши словари имеют одинаковый размер, это должно сработать, и v2.values() вернет значения v2 в порядке построения.

person sgk525    schedule 03.10.2017

ты можешь сделать :

>>> v1={'name1': '10', 'name2': '20'}
>>> v2={'quantity1': '4', 'quantity2': '5'}   
>>> d={'name'+str(i+1) : int(v1['name'+str(i+1)])*int(v2['quantity'+str(i+1)]) for i in range(len(v1))}
>>> d
{'name2': 100, 'name1': 40}
person Dadep    schedule 03.10.2017

Вам просто нужно добавить что-то, чтобы сопоставить ключи в первом словаре с ключами во втором. Проще всего это сделать с помощью третьего словаря с именем keymap в приведенном ниже коде. Ключи в первом словаре определяют те, которые появятся в возвращаемом.

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

v1={'name1': '10', 'name2': '20'}
v2={'quantity1': '4', 'quantity2': '5'}
keymap = {'name1': 'quantity1', 'name2': 'quantity2'}  # Added.

foo = (lambda dct_1, dct_2:
        {key: int(dct_2[keymap[key]]) * int(dct_1[key]) for key in dct_1})

print(foo(v1, v2))  # -> {'name1': 40, 'name2': 100}
person martineau    schedule 03.10.2017