Как мне написать генератор "фильтра" в python? - PullRequest
1 голос
/ 04 апреля 2020

Я изучаю топи c генераторов в python и не могу решить упражнение.

Мне нужно написать генератор "фильтра", который принимает предикат и последовательность, и создает последовательность, в которой нет элементов, для которых предикат имеет значение true. (похоже на встроенную функцию фильтра)

Я знаю, как решить задачу с помощью функции, но я не знаю, как решить ее с помощью «yield».

Это мой код:

def filter(x, lst):
    i = 0
    while i < len(lst):
        if lst[i] != x:
            yield lst[i]
            i += 1
        else:
            continue

Я был бы рад получить помощь с заданием.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

вы можете использовать:

def my_filter(pred, seq):
    for item in seq:
        if not pred(item):
            yield item

my_filter Генератор выполняет итерацию по вашей последовательности, и когда элемент, примененный к предикату, равен False, он выдаст этот элемент

пример :

list(my_filter(lambda x: x >4, [0, 1, 5, 2]))

# [0, 1, 2]
1 голос
/ 04 апреля 2020

Вы можете использовать литерал генератора, чтобы выполнить sh это в одну строку

def my_filter(x, lst):
    yield from (i for i in lst if i != x)

Это использует ключевое слово return вместо yield, но на самом деле эквивалентно, так как оно также возвращает генератор, который возвращает то же самое элементы.

def my_filter(x, lst):
    return (i for i in lst if i != x)
...