Python, как уменьшить список кортежей? - PullRequest
10 голосов
/ 07 апреля 2011

Я могу использовать map и sum для достижения этой функциональности, но как использовать reduce?

Есть 2 списка: a, b, они имеют одинаковыеколичество значений.Я хочу вычислить

a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n]

Рабочая версия, которую я написал с использованием map, равна

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 ]

10 голосов
/ 07 апреля 2011

Первый аргумент лямбда-функции - это сумма, а второй аргумент - следующая пара элементов:

value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0)
7 голосов
/ 07 апреля 2011

Решение с использованием reduce и map,

from operator import add,mul

a = [1,2,3]
b = [4,5,6]

print reduce(add,map(mul,a,b))
7 голосов
/ 07 апреля 2011

Я бы сделал это так (я не думаю, что вам нужна лямбда) ...

sum(x*y for x, y in zip(a, b))

Это также кажется немного более явным. Zip AB, умножьте их и суммируйте условия.

1 голос
/ 26 июля 2017

похоже, вы хотите внутренний продукт. использовать внутренний продукт. 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)

вывод: массив ([[14, 38, 62], [86, 110, 134]])

1 голос
/ 02 июля 2015

Трудности с уменьшением случаются, когда у вас неверная карта.

Давайте возьмем выражение: value = sum(map(lambda (x,y): x*y, zip(a, b)))

Карта - это трансформация. Нам нужно преобразовать кортежи в простые плоские значения. В вашем случае это будет выглядеть так:

map(lambda x: x[0]*x[1], zip(a,b))

И затем, если вы хотите выразить sum через 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)
...