如何在Python列表理解中有效地过滤计算值?

2024-06-16 10:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

Python列表理解语法使在理解中过滤值变得容易。例如:

result = [x**2 for x in mylist if type(x) is int]

将返回mylist中整数平方的列表。但是,如果测试涉及一些(代价高昂的)计算,并且您希望对结果进行筛选,会怎样?一种选择是:

result = [expensive(x) for x in mylist if expensive(x)]

这将导致一个非“false”昂贵(x)值的列表,但是每x调用两次昂贵的()。是否有一个理解语法允许您在每x只调用昂贵一次的情况下执行此测试?


Tags: infalse列表forifistype语法
3条回答

最明显的(我认为也是最可读的)答案是不要使用列表理解或生成器表达式,而是使用真正的生成器:

def gen_expensive(mylist):
    for item in mylist:
        result = expensive(item)
        if result:
            yield result

它需要更多的水平空间,但它更容易看到它的作用一目了然,你最终不会重复自己。

如果计算已经很好地绑定到函数中,那么使用filtermap怎么样?

result = filter (None, map (expensive, mylist))

如果列表很大,可以使用itertools.imap

经过一分钟的思考,我想出了自己的答案。它可以通过嵌套的理解来完成:

result = [y for y in (expensive(x) for x in mylist) if y]

我想这是可行的,尽管我发现嵌套的理解只有很少的可读性

相关问题 更多 >