Вычитая все значения в словарях, где значения являются списком с плавающей точкой
У меня есть два словаря, где каждое значение является списком с плавающей точкой
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 раз с разными словарями каждый раз.
2 ответа
Решение
Используйте вникание с
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]}
Если скорость важна, тогда вы можете попробовать 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)