Вопрос по python, list-comprehension – Понимание списка Python: возврат тестовой функции

6

Есть ли способ проверить возврат функции в понимании списка (или dict)? Я'я хотел бы избежать написания этого:

lst = []
for x in range(10):
  bar = foo(x)
  if bar:
    lst.append(bar)

и вместо этого используйте понимание списка. Очевидно, я нене хочу писать:

[foo(x) for x in range(10) if foo(x)]

так?

[foo(x) for x in range(10) if ??? ]
@mgilson: И в первом примере он делает это только один раз. Tim Pietzcker
@Rohit Jain - в зависимости отfoo, это может быть дорогая операция, которую вы нене хочу делать дважды. mgilson
@mgilson: Очевидно, тымы право. Ура! Tim Pietzcker
@TimPietzcker .. Да, я говорил только о понимании первого списка. Rohit Jain

Ваш Ответ

2   ответа
10

Как насчет

filter(None, map(foo, range(10)))

Если вы нехочу сохранить промежуточный список, заменитьmap() сitertools.imap(), И сitertools.ifilter()Все это можно превратить в генератор.

itertools.ifilter(None, itertools.imap(foo, range(10)))
Хорошее решение действительно. Adrien
Или вместоimap, вы можете использовать genexp:filter(None,(foo(x) for x in range(10))) mgilson
Я всегда чувствовал, чтоfilter должен принять форму 1 аргумента, а также ... mgilson
5

ванный список из генератора впоследствии.

Пример:

# create generator via generator expression
results = (foo(x) for x in xrange(10))
# build result list, not including falsy values
filtered_results = [i for i in results if i]

Для справки:

https://docs.python.org/3/glossary.html#term-generatorhttps://wiki.python.org/moin/Generatorshttps://www.python.org/dev/peps/pep-0289/

Похожие вопросы