2016-04-10 5 views
-1

Если у меня есть что-то вроде:объединения фильтр с несколькими аргументами лямбда

filter(lambda x,y: x + y > 5, [3,6]) Я пытаюсь получить все пары элементов, сумма которых больше 5. я получаю ошибку говоря лямбда ожидает 2 входа, но только один дается. если я тогда сделаю filter((lambda x,y: x + y > 5, [3,6],[6,4])), тогда я получаю сообщение об ошибке, когда фильтру дано слишком много аргументов. Можно ли это сделать?

+3

Что вы пытаетесь достичь? Из этого контекста не ясно. Вы пытаетесь получить все пары элементов, сумма которых больше 5? –

+0

да, получить все пары элементов, сумма которых больше 5 – Nolohice

+0

У вас есть список списков? – styvane

ответ

3

Давайте предположим, что у вас есть список пар:

pairs = [[3,6],[0,4]] 

Тогда вы можете написать что-то вроде:

filter(lambda pair: sum(pair) > 5, pairs) 

И он должен работать вне OK. Вы также можете написать это:

filter(lambda pair: pair[0] + pair[1] > 5, pairs) 

Или (на python2.x ТОЛЬКО - Это использование, безусловно, не рекомендуется, я добавляю его здесь только в случае, если вы столкнетесь с ним в какой-то код в другом месте):

filter(lambda (x, y): x + y > 5, pairs) 

Обратите внимание, все эти опции ограничивают себя встроенную функцию, filter. Если мы ослабляем это ограничение, многие (большинство?) Pythonistas будут защищать фильтрацию, используя вместо этого список-понимание. Это может выглядеть следующим образом:

[[x, y] for x, y in pairs if x + y > 5] 

Или:

[pair for pair in pairs if sum(pair) > 5] # look familiar :-)? 
-2

Функция фильтра Python ожидает функцию с одним входным и логическим выходом. Ваша функция arity (Signature) не так. Каждый из элементов итератора передается в функцию, и если возвращаемое значение истинно, элемент будет добавлен к выходу.

Смежные вопросы