2013-06-11 2 views
0

У меня два словаря:питона multipling два словаря

prices = {"banana": 4,"apple": 2} 
stock = {"banana": 6,"apple": 0,} 

Как я могу получить сумму объединения значений от 1 и 2 словаря (4 * 6 + 2 * 0 - в этом примере)?

+0

Что такое ожидаемое поведение, если два словаря не одни и те же ключи? –

+2

Я сделал запрос, что умножение должно быть добавлено в 'collections.Counter', но оно не прошло: https://groups.google.com/forum/?fromgroups#!topic/python-ideas/-HYxQK6cbps – jamylak

+0

(вероятно, к лучшему, хотя), хотя это было бы хорошим примером для использования – jamylak

ответ

5
>>> prices = {"banana": 4,"apple": 2} 
>>> stock = {"banana": 6,"apple": 0} 
>>> {k: prices[k] * stock[k] for k in prices.viewkeys() & stock.viewkeys()} 
{'banana': 24, 'apple': 0} 
+0

4 ответов за 5 секунд. Ой. Мои. Бог. (Кстати, вы были сначала jamylak;)) – TerryA

+0

Это такой вопрос с низкой подвеской. Непреодолимый, чтобы не попробовать. Они не должны быть разрешены. – Joe

+0

Мне не нравится viewkeys, потому что это 2,7 конкретных –

0
>>> prices = {"banana": 4,"apple": 2} 
>>> stock = {"banana": 6,"apple": 0} 
>>> sum(prices[k] * stock[k] for k in stock) 
24 
+0

сумма (цены [k] * stock [k] для k на складе) отличный ответ. – user2469891

+0

@ user2469891 Вы можете [принять ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235), если он сработает для вас. –

1

петля над пересечением ключей:

mult = {} 

for key in prices.viewkeys() & stock.viewkeys(): 
    mult[key] = prices[key] * stock[key] 

Это может быть упрощено до ДИКТ понимания:

mult = {key: prices[key] * stock[key] for key in prices.viewkeys() & stock.viewkeys()} 

Это использует dict.viewkeys() метод (dict.keys() в Python 3), который действует как set; оператор & действует как оператор пересечения на множествах и дает вам все ключи, которые присутствуют в и словари.

Подводя общий запас, использовать sum() функцию:

total_stock = sum(prices[key] * stock[key] for key in prices.viewkeys() & stock.viewkeys()) 

Демонстрация:

>>> prices = {"banana": 4,"apple": 2} 
>>> stock = {"banana": 6,"apple": 0} 
>>> {key: prices[key] * stock[key] for key in prices.viewkeys() & stock.viewkeys()} 
{'banana': 24, 'apple': 0} 
>>> sum(prices[key] * stock[key] for key in prices.viewkeys() & stock.viewkeys()) 
24 
0
prices = {"banana": 4,"apple": 2} 
stock = {"banana": 6,"apple": 0,} 
t=0 
for i in prices: 
     t+=prices[i]*stock[i] 
print t 
+2

'dict.keys()' не требуется, итерация по типу возвращает только его ключи. –

+0

Спасибо .. Отредактировано – tusharmakkar08

3

Может быть, немного короче и аккуратнее, чем другие решения.

>>> prices = {"banana": 4, "apple": 2} 
>>> stock = {"banana": 6, "apple": 0} 
>>> {key: value * stock.get(key, 0) for key, value in prices.items()} 
{'banana': 24, 'apple': 0} 

Использование prices.iteritems() в Python 2.

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

>>> sum(value * stock.get(key, 0) for key, value in prices.items()) 
24 
+0

Это отличает решение от @Martijn и меня, так как оно также умножает ключи, которые существуют только в 'prices' – jamylak

+0

@jamylak. Я опубликовал это решение в основном из-за моего отвращения к символу ['&'] (http://3.bp.blogspot.com/-ae-Jy6EBy00/T06tOwXz80I/AAAAAAAAbug/O3SxiaOSzqU/s1600/4dandforsand.jpg). – Volatility

+0

@ Volatility lol для рисунка. : D –

2

Не предполагая ключи идентичны

sum(prices[k] * stock.get(k, 0) for k in prices) 
Смежные вопросы