Python как уменьшить список кортежей?
Я могу использовать map
и sum
для достижения этой функции, но как использовать reduce
?
есть 2 списка: a
, b
, у них одинаковое количество значений. Я хочу вычислить
a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n]
рабочая версия, которую я написал с помощью map
is
value = sum(map(lambda (x,y): x*y, zip(a, b)))
как использовать reduce
потом? Я написал:
value = reduce(lambda (x,y): x[0]*y[0] + x[1]*y[1], zip(a, b)))
я получил ошибку "TypeError: 'float' object is unsubscriptable
".
может кто-нибудь пролить свет на это?
5 ответов
первый аргумент лямбда-функции-это сумма, а второй аргумент-следующая пара элементов:
value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0)
Я бы сделал это так (я не думаю, что вам нужна лямбда)...
sum(x*y for x, y in zip(a, b))
Это также кажется немного более явной. Zip AB, умножьте их и суммируйте условия.
решение с использованием reduce
и map
,
from operator import add,mul
a = [1,2,3]
b = [4,5,6]
print reduce(add,map(mul,a,b))
трудности с уменьшением происходят, когда у вас неправильная карта.
давайте возьмем выражение:
value = sum(map(lambda (x,y): x*y, zip(a, b)))
карта трансформации. Нам нужно преобразовать кортежи в простая квартира значения. В вашем случае это будет выглядеть так:
map(lambda x: x[0]*x[1], zip(a,b))
и затем, если вы хотите выразить sum
via reduce
- это будет выглядеть как:
reduce(lambda x,y: x + y, map)
вот это пример:
a = [1,2,3]
b = [4,5,6]
l = zip(a,b)
m = map(lambda x: x[0]*x[1], l)
r = reduce(lambda x,y: x + y, m)
похоже, вам нужен внутренний продукт. используйте внутренний продукт. https://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html
np.inner(a, b) = sum(a[:]*b[:])
обычный внутренний продукт на векторы:
a = np.array([1,2,3])
b = np.array([0,1,0])
np.inner(a, b)
выход: 2
многомерная пример:
a = np.arange(24).reshape((2,3,4))
b = np.arange(4)
np.inner(a, b)
выход: !--6-->