2009-12-04 47 views
3

什麼是做在Python以下的最佳方式:Python中從列表生成器表達式

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

這可能是一個結點的問題,但不是列表解析生成新的列表我們不需要,只是佔用內存?如果我們能夠製作類似迭代器的列表理解,那會更好嗎?

回答

9

是的(對你的兩個問題)。

通過使用括號而不是方括號,您可以爲該序列創建所謂的「生成器表達式」,它完全符合您的建議。它允許您迭代序列而不分配列表來同時保存所有元素。

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

發生器表達式的細節記錄在PEP 289中。

+0

感謝:

如果你返回some_list,您可以進一步使用生成的表達和懶惰評估簡化它。我不知道你可以使用那樣的括號:) – disc0dancer 2009-12-04 23:14:38

1

爲什麼不乾脆:

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

好吧,這比我的情況要複雜一點:)這是我給出的一個簡單的例子來說明這一點。我不得不使用reduce(),但現在我可以使用any()和all():) – disc0dancer 2009-12-07 01:08:07

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()

def foo(some_list): 
    return (do_something_with(item.attr) for item in some_list)