在Python中从列表创建生成器表达式
在Python中,做以下事情的最佳方法是什么:
for item in [ x.attr for x in some_list ]:
do_something_with(item)
这可能是个初学者的问题,但我想问,列表推导式是不是在生成一个我们不需要的新列表,这样会占用内存?如果我们能做一个像迭代器那样的列表推导式,不是更好吗?
3 个回答
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)
1
为什么不直接这样做:
for x in some_list:
do_something_with(x.attr)
9
是的(对你两个问题的回答都是肯定的)。
通过使用圆括号而不是方括号,你可以创建一个叫做“生成器表达式”的东西,这个表达式正好能实现你想要的功能。它允许你在不需要同时存储所有元素的情况下,逐个遍历这个序列。
for item in (x.attr for x in some_list):
do_something_with(item)
关于生成器表达式的详细信息可以在 PEP 289 中找到。