在Python中,以下哪种方法最好:
for item in [ x.attr for x in some_list ]:
do_something_with(item)
这可能是一个初级问题,但列表推导式是否会生成一个我们不需要的新列表并占用内存?如果我们能创建一个类似于迭代器的列表推导式会不会更好呢?
在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)
这个问题被标记为函数式编程
,但没有适当的答案,所以这里提供一个函数式解决方案:
from operator import itemgetter
map(do_something_with, map(itemgetter('attr'), some_list))
map()
使用迭代器,但Python 2创建列表。对于Python 2,请改用itertools.imap()
。some_list
,则可以使用生成器表达式和惰性求值进一步简化:def foo(some_list):
return (do_something_with(item.attr) for item in some_list)