У Python нет метода «все», где я могу передать лямбду? Или я что-то пропустил? Я знаю о понимании списка, но как насчет этого?

 res = map(....., [True, False, False, ......very long])
 # how to check that all items in "res" are True using a functional approach?

Да, есть способы проверить это, но нет функционального способа? Я хочу сделать что-то вроде:

res2 = all(lambda x: x == True, res)
-3
Alan Coromano 16 Дек 2015 в 15:36

4 ответа

Лучший ответ

Там нет встроенной функции, но вы можете легко написать ее самостоятельно, составив map с all:

def all_function(predicate, iterable):
    return all(map(predicate, iterable))
1
ecatmur 16 Дек 2015 в 12:51

all(function(x) for x in res) - это правильный способ использовать функцию с all(), но если вы настаиваете на том, чтобы сделать это «функциональным способом», попробуйте filter:

list(filter(lambda x: x == True, res)) == res
0
Eugene Yarmash 16 Дек 2015 в 21:30

Нет, all не существует реализации, которая принимает обратный вызов, потому что то же самое можно выразить с помощью выражения генератора. Используя более сложный пример «проверьте, все ли значения превышают 5» для лучшей выборки:

res = map(..)
if all(x > 5 for x in res):
    print('Yes!')

Здесь нет особой необходимости для обеспечения альтернативной реализации all, поскольку этот шаблон может обрабатывать все, что вы захотите, и мантра Python - это один очевидный способ сделать что-то.

1
deceze 16 Дек 2015 в 12:54

Если вы хотите позвонить all с такой функциональностью, как lambda x: x == True. Это избыточное задание, потому что all() это именно то, что обозначает эта функция, но если вы хотите проверить достоверность итерируемых элементов, а затем использовать all(), один из путей - использование выражения-генератора в {{ X4}} путем вызова пользовательской функции для повторяемых элементов.

all(func(x) for x in res) 

Обратите внимание, что func() должен возвращать значение bool для каждого элемента. Или, по крайней мере, результат, который интерпретируется Python как False.

0
Kasramvd 16 Дек 2015 в 12:49