Создание выражения генератора из списка в python - PullRequest
3 голосов
/ 05 декабря 2009

Какой лучший способ сделать следующее в Python:

for item in [ x.attr for x in some_list ]:
    do_something_with(item)

Это может быть сложный вопрос, но разве понимание списка не создает новый список, который нам не нужен, и просто занимает память? Разве не было бы лучше, если бы мы могли создать итераторное понимание списка.

Ответы [ 3 ]

9 голосов
/ 05 декабря 2009

Да (на оба ваших вопроса).

Используя круглые скобки вместо скобок, вы можете создать так называемое «выражение-генератор» для этой последовательности, которое в точности соответствует предложенному вами. Это позволяет перебирать последовательность без выделения списка для одновременного хранения всех элементов.

for item in (x.attr for x in some_list):
    do_something_with(item)

Подробности выражений генератора задокументированы в PEP 289 .

1 голос
/ 05 декабря 2009

Почему бы просто:

for x in some_list:
    do_something_with(x.attr)
0 голосов
/ 29 июня 2013

Этот вопрос помечен functional-programming без соответствующего ответа, поэтому вот функциональное решение:

from operator import itemgetter

map(do_something_with, map(itemgetter('attr'), some_list))

Python 3 map() использует итератор, но Python 2 создает список. Для Python 2 вместо этого используйте itertools.imap().

Если вы возвращаете some_list, вы можете еще больше упростить его, используя выражение генератора и ленивую оценку:

def foo(some_list):
    return (do_something_with(item.attr) for item in some_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...