Перебор списка целых чисел с использованием map и списка функций - PullRequest
0 голосов
/ 10 декабря 2018

Привет, ребята. Я пытаюсь написать код, который использует список функций и список целых чисел и возвращает только те, которые имеют по крайней мере 1 true в списке функций, например:

tuple(lambda func,data:filter(lambda x:map(lambda y:y(x)==true,func),data))

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

поэтому список должен возвращать 4,6,8,10, но вместо этого он возвращает весь список, кто-нибудь знает почему?

PS Я знаю, что это можно сделать очень легко другим способом, но это лямбда-упражнение.

Ответы [ 2 ]

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

Вы можете использовать выражение, подобное следующему:

tuple(filter(lambda x: any(filter(lambda f: f(x), func)), data))

Итак,

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

In [18]: tuple(filter(lambda x: any(filter(lambda f: f(x), func)), data))
Out[18]: (2, 4, 5, 6, 7, 8, 9, 10)

Также обратите внимание, что ваше выражение поднимает TypeError, поэтому я не знаю, чтоВы имеете в виду возвращение всего списка.

Вероятно, было бы более читабельным использовать что-то вроде:

In [23]: tuple(
    ...:     x for x in data
    ...:     if any(f(x) for f in func)
    ...: )
Out[23]: (2, 4, 5, 6, 7, 8, 9, 10)

Или без any (смешное ограничение)

In [29]: tuple(filter(lambda x: tuple(filter(None, map(lambda f: f(x), func))), data))
Out[29]: (2, 4, 5, 6, 7, 8, 9, 10)
0 голосов
/ 10 декабря 2018

Более Pythonic отображает эти функции, используя списки:

data = range(1, 11)
funcs = (lambda x: x > 3, lambda x: x % 2 == 0)
new_data = [x for x in l if all(f(x) for f in funcs)]
# new_data == [4, 6, 8, 10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...