Пропустить запись в выражении генератора - PullRequest
0 голосов
/ 24 сентября 2018

Каков наилучший способ пропустить записи в выражении генератора , которые созданы с использованием функции и другого генератора?

По сути, я ищу выражение, которое выглядит следующим образом:

some_iter = (some_function(_x, _y, **kwargs) or continue for _x, _y in some_generator(*x))

(но оператор continue явно не работает в этом контексте)

Функционально он должен действовать следующим образом:

def some_iter(*x):
    for _x, _y in some_generator(*x):
        x = some_function(_x, _y, **kwargs)
        if x:
            yield x

1 Ответ

0 голосов
/ 24 сентября 2018

Понимание списка позволяет фильтровать , а затем карту.Вы хотите вручную map сначала выполнить свою функцию.

gen = (x for x in map(function, generator(*args)) if x)

Выше приведено для generator, которая выдает одиночные аргументы.Вы можете использовать itertools.starmap, если он возвращает tuple аргументов.

from itertools import starmap

gen = (x for x in starmap(function, generator(*args)) if x)

Наконец, если вам также необходимо передать аргументы ключевого слова, вам нужно будет полагаться наlambda function.

gen = (x for x in map(lambda args: function(*args, **kwargs), generator(*g_args)) if x)

Хотя, обратите внимание, что в этот момент генератор стиля функции может быть более читабельным.

def gen(*x):
    for args in generator(*x):
        x = some_function(*args, **kwargs)
        if x:
            yield x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...