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

3 投票
3 回答
1108 浏览
提问于 2025-04-15 16:42

在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 中找到。

撰写回答