Вычитая все значения в словарях, где значения являются списком с плавающей точкой

У меня есть два словаря, где каждое значение является списком с плавающей точкой

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)
Другие вопросы по тегам