2009-12-04 3 views
3

Что такое лучший способ сделать следующее в Python:Создание выражения генератора из списка в Python

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

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

ответ

9

Да (по обоим вопросам).

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

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

Детали выражений генератора описаны в PEP 289.

+0

Спасибо. Я не знал, что вы можете использовать круглые скобки :) – disc0dancer

1

Почему не просто:

for x in some_list: 
    do_something_with(x.attr) 
+0

Ну, это немного сложнее, чем в моем случае :) Это был простой пример, который я дал, чтобы проиллюстрировать суть. Мне пришлось использовать reduce(), но теперь я могу просто с любыми() и all() :) – disc0dancer

0

Этот вопрос помечен 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) 
Смежные вопросы