Фильтрация только с одним условным - PullRequest
0 голосов
/ 11 декабря 2018

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

Например, если кортеж равен (1, 2, 3, 4, 5, 6, 7, 8, 9, 10), а кортеж функций равен (lambda x: x > 3, lambda x: x % 2 == 0), я должен получить новый кортеж, который выглядит как [2, 5, 7, 9]потому что они делают только одно из двух правил, чтобы вернуть True.пока это мой код, и я понятия не имею, как это сделать ...

func = (lambda x: x > 3, lambda x: x % 2 == 0)
data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

a = lambda func, data: tuple(filter(lambda x: tuple(filter(None, map(lambda f: f(x), func))), data))
print(a(func, data))

Этот код возвращает только целые числа, которые применяются к обоим терминам, но мне нужно сделать это просто один .

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать bool.__xor__, чтобы гарантировать выполнение только одной из двух функций в кортеже func:

from functools import reduce
tuple(filter(lambda x: reduce(bool.__xor__, map(lambda f: f(x), func)), data))

Возвращает:

(2, 5, 7, 9)
0 голосов
/ 11 декабря 2018

Вот оно:

a = lambda func, data: tuple(filter(lambda d: (sum(map(lambda f: f(d), func)) == 1), data))

Поскольку это действительно просто надуманное упражнение, я не буду пытаться объяснить это ужасное выражение.Но путь к этому - сначала написать код понятным способом с помощью for циклов, if блоков и т. Д., А затем по одному шагу за раз заменять каждый компонент соответствующим map, filter и т. Д.

Единственный прием, который я здесь использую, - это автоматическое логическое преобразование в целое число: sum(sequence_of_bool) == 1 означает, что ровно один бул True.

Мой полный тестовый код:

func = (lambda x: x > 3, lambda x: x % 2 == 0)
data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
a = lambda func, data: tuple(filter(lambda d: (sum(map(lambda f: f(d), func)) == 1), data))
print(a(func, data))

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