从python中的列表创建生成器表达式

时间:2009-12-04 23:00:35

标签: python list generator functional-programming

在Python中执行以下操作的最佳方法是什么:

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

这可能是一个小问题,但是列表理解不是生成我们不需要的新列表而只是占用内存吗?如果我们能够像迭代器一样进行列表理解,那会不会更好。

3 个答案:

答案 0 :(得分:9)

是(对你的两个问题)。

通过使用括号而不是括号,您可以为该序列创建所谓的“生成器表达式”,这与您提出的完全相同。它允许您迭代序列而不分配列表以同时保存所有元素。

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

生成器表达式的详细信息记录在PEP 289

答案 1 :(得分:1)

为什么不呢:

for x in some_list:
    do_something_with(x.attr)

答案 2 :(得分: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)