Python, как развернуть кортежи в лямбде? - PullRequest
4 голосов
/ 22 марта 2012

У меня есть 2 списка одинаковой длины, и я пытаюсь получить их скалярное произведение, но это не работает так:

sum(map(lambda a,b: a*b, zip(list1, list2)))

error: TypeError: <lambda>() takes exactly 2 arguments (1 given)

Даже если этот код не подходит для моей задачи, есть ли способ заставить lambda работать с кортежами для таких случаев?

Я бы хотел сделать что-то вроде

lambda x: (a,b)=x;a*b 

Но это не будет работать в стиле C ';' )

Спасибо за ответы, еще нужно многое узнать о Python)

Ответы [ 6 ]

18 голосов
/ 22 марта 2012

ну, для этого вам не нужна лямбда ...

sum(a*b for a, b in zip(list1, list2))

даже zip() немного меньше, чем идеально ... чтобы избежать создания списка, используйте либо python3, либо itertools.izip:

sum(a*b for a, b in itertools.izip(list1, list2))

но если, по какой-то причине, вы действительно хотели использовать лямбду, передайте каждый список на карту отдельно:

sum(map(lambda a, b: a*b, list1, list2))

и даже тогда вам не нужна лямбда, в модуле operator доступен вызываемый продукт:

sum(map(operator.mul, list1, list2))

но используйте генератор в первом или втором примере, обычно он будет быстрее.

5 голосов
/ 22 марта 2012

Вы можете просто написать

sum(a*b for a,b in zip(list1, list2))

или используйте карту правильно:

sum(map(lambda (a,b): a*b, list1, list2))

map делает zip свои аргументы, на самом деле zip( .. ) это просто map(None, ..).

Вы также можете распаковать аргументы, когда функция вызывается в Python2, но эта необычная функция была удалена в 3:

sum(map((lambda (a,b): a*b), zip(list1, list2)))
3 голосов
/ 22 марта 2012

Вы можете использовать модуль operator ( документы ):

 sum(map(lambda item: operator.mul(*item), zip(list1, list2)))
2 голосов
/ 22 марта 2012
sum(x[0]*x[1] for x in zip(list1, list2))

Понимания списков и выражения генератора - правильный путь.

1 голос
/ 13 ноября 2016

Отвечая на первоначальный вопрос OP о лямбде, принимающей несколько аргументов через zip.

Вам необходимо использовать круглые скобки вокруг lambda аргументов, например:

sum(map(lambda (a,b): a*b, zip(list1, list2)))

Проверено на Python 2.7

0 голосов
/ 15 октября 2017
(lambda x:  x[0] == ... and x[1] != ..... , mylistoftuples )

Кортеж - это обычный элемент списка, поэтому

x <- {tuples...}

Таким образом, x может рассматриваться как обычный кортеж (x1,x2,x..,xk), как и любая другая назначенная переменная кортежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...