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:
最明显的(我认为也是最可读的)答案是不要使用列表理解或生成器表达式,而是使用真正的生成器:
它需要更多的水平空间,但它更容易看到它的作用一目了然,你最终不会重复自己。
如果计算已经很好地绑定到函数中,那么使用
filter
和map
怎么样?如果列表很大,可以使用
itertools.imap
。经过一分钟的思考,我想出了自己的答案。它可以通过嵌套的理解来完成:
我想这是可行的,尽管我发现嵌套的理解只有很少的可读性
相关问题 更多 >
编程相关推荐