什麼是做在Python以下的最佳方式:Python中從列表生成器表達式
for item in [ x.attr for x in some_list ]:
do_something_with(item)
這可能是一個結點的問題,但不是列表解析生成新的列表我們不需要,只是佔用內存?如果我們能夠製作類似迭代器的列表理解,那會更好嗎?
什麼是做在Python以下的最佳方式:Python中從列表生成器表達式
for item in [ x.attr for x in some_list ]:
do_something_with(item)
這可能是一個結點的問題,但不是列表解析生成新的列表我們不需要,只是佔用內存?如果我們能夠製作類似迭代器的列表理解,那會更好嗎?
是的(對你的兩個問題)。
通過使用括號而不是方括號,您可以爲該序列創建所謂的「生成器表達式」,它完全符合您的建議。它允許您迭代序列而不分配列表來同時保存所有元素。
for item in (x.attr for x in some_list):
do_something_with(item)
發生器表達式的細節記錄在PEP 289中。
爲什麼不乾脆:
for x in some_list:
do_something_with(x.attr)
好吧,這比我的情況要複雜一點:)這是我給出的一個簡單的例子來說明這一點。我不得不使用reduce(),但現在我可以使用any()和all():) – disc0dancer 2009-12-07 01:08:07
這個問題被標記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)
感謝:
如果你返回
some_list
,您可以進一步使用生成的表達和懶惰評估簡化它。我不知道你可以使用那樣的括號:) – disc0dancer 2009-12-04 23:14:38