Освобождение от продолжений из очевидного ограничения Python - PullRequest
0 голосов
/ 30 января 2019

Давайте рассмотрим список с числами, подобными следующим:

a_lst = [1,2,3,2,3,4,5,6,2,2]

Теперь мне нужно написать программу на python, которая подсчитывает количество вхождений, скажем, «2», используя только «уменьшить».

Я также прошел через следующий вопрос:

с помощью Python Reduce Подсчитать количество вхождений символа в строку

Получил отличныйОтвет, однако я хотел посмотреть, есть ли способ заменить условие «если» внутри лямбда-функции на like (x == 2).Я имею в виду выполнение того же, не используя явно условие «если».

Я думал о том, чтобы найти решение путем передачи лямбда-функции, которая принимает другую лямбда-функцию в качестве аргумента для функции Reduce.Но оказалось, что это всего лишь дневной сон и ничто иное, поскольку после передачи лямбда-функции в качестве аргумента вызов его внутри внешнего тела лямбда-функции потерпел поражение, сделав его лямбда-функцией.

Oneбольше фиаско было о желании создать конструкцию, в которой лямбда-функция могла бы вызывать себя в конце своего тела.(Я понимаю, что приведенная выше строка звучит совершенно бессмысленно, но я имел в виду конструкцию, которая имела эквивалентную мощность лямбды, называющей себя)

Я прошел через концепцию стиля прохождения продолжения, где в терминах питонаФункция возвращает лямбда-функцию, которая принимает аргументы, которые получила функция. Но я не уверен, что по определению продолжение является технически точным.Можно ли его использовать для решения этой проблемы?

1 Ответ

0 голосов
/ 30 января 2019

Ничто не мешает вам написать

лямбда-функцию с подобным (x == 2)

from functools import reduce
a_lst = [1,2,3,2,3,4,5,6,2,2]
reduce(lambda x, y: x + (y == 2), a_lst, 0) #Output: 4

Причина, по которой это работает, заключается в том, что bool являетсяподкласс int в python, и может использоваться для математических операций.

Если одно это, однако, не удовлетворяет вас, вы можете по-настоящему участвовать в модулях operator и functools. Справочные документы.

from functools import reduce, partial
import operator
reduce(operator.add,map(lambda x: operator.eq(x, 2), a_lst), 0) #Output: 4

и заменить лямбду на частичную функцию

equals_2 = partial(operator.eq, 2)
reduce(operator.add,map(equals_2, a_lst), 0) #Output: 4

Слово предостережения
Itв этом случае может быть неразумно зацикливаться на одной парадигме программирования (функциональной).Python превосходен в разрешении любой парадигмы программирования, но практически превосходит чистоту.Намного проще и проще перебирать список и самостоятельно подсчитывать число 2, используя метод .count.Не нужно изобретать велосипед там, где это не имеет смысла.Для будущих читателей это всего лишь демонстрация, а не рекомендация о том, как считать события в списке.

...