在Python中从列表创建生成器表达式

3

在Python中,以下哪种方法最好:

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

这可能是一个初级问题,但列表推导式是否会生成一个我们不需要的新列表并占用内存?如果我们能创建一个类似于迭代器的列表推导式会不会更好呢?

3个回答

9

是的(对于你的两个问题都是)。

通过使用括号而不是方括号,您可以创建所谓的“生成器表达式”来生成该序列,这正是您提出的方法。它允许您在不同时分配列表以同时保存所有元素的情况下迭代该序列。

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

生成器表达式的详细信息在PEP 289中有文档记录。


谢谢。我不知道你可以那样使用括号 :) - disc0dancer

1
为什么不直接这样做:
for x in some_list:
    do_something_with(x.attr)

这在我的情况下有点复杂 :) 这是我举的一个简单的例子来说明问题。 我以前不得不使用reduce(),但现在我可以使用any()和all():) - disc0dancer

0

这个问题被标记为函数式编程,但没有适当的答案,所以这里提供一个函数式解决方案:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接