2014-01-24 164 views
1

我有兩個字典的列表,其中每個值是浮動減去字典中的所有值都值彩車

d1 = {'a': [10,11,12], 'b': [9,10,11], 'c': [8,9,10], 'd': [7,8,9]} 

d2 = {'a': [1,1,1], 'b': [2,3,2], 'c': [1,2,2], 'd': [4,3,4]} 

我想減去字典之間的值D1-D2並得到結果的列表:

d3 = {'a': [9,10,11], 'b': [7,7,9], 'c': [7,7,9], 'd': [3,5,5] } 

我在本網站上找到了關於如何減去每個鍵只有一個浮點值的詞典以及如何在每個詞典中減去列表,但不是在詞典之間減去詞條的條目。

另外,速度需要考慮在內,因爲我將每次使用不同的字典運行這個~200,000次。

回答

4

使用與

zip的字典理解:

>>> {k:[x-y for x, y in zip(d1[k], d2[k])] for k in d1} 
{'a': [9, 10, 11], 'c': [7, 7, 8], 'b': [7, 7, 9], 'd': [3, 5, 5]} 

map

>>> from operator import sub 
>>> {k:map(sub, d1[k], d2[k]) for k in d1} 
{'a': [9, 10, 11], 'c': [7, 7, 8], 'b': [7, 7, 9], 'd': [3, 5, 5]} 
+0

+1你的回答非常快! –

0

如果速度是重要的,那麼你可以嘗試numpy

import numpy as np 

def sub(x, y): 
    # probably it would be better if x and y already had numpy arrays as the values. 
    return {key: np.array(x[key]) - np.array(y[key]) for key in x} 

print sub(d1, d2) 
+0

我不確定這是否更快,因爲您每次都將'list'轉換爲'np.array'。 – Akavall