python中的for、if和set具有更好的代码结构

python中的for、if和set具有更好的代码结构,python,if-statement,for-loop,set,python-3.x,python-2.x,Python,If Statement,For Loop,Set,Python 3.x,Python 2.x,我的代码如下。它循环遍历作为冻结集集的blob,并检查每个blob是否与作为集的mapped相交。如果blob确实与“已映射”相交,并且还满足“为终点”的条件,则将相交集添加到结果中 result = set() for b in blobs: mapped_b = b & mapped

我的代码如下。它循环遍历作为冻结集集的blob,并检查每个blob是否与作为集的mapped相交。如果blob确实与“已映射”相交,并且还满足“为终点”的条件,则将相交集添加到结果中

result = set()
for b in blobs:                                                   
    mapped_b = b & mapped                                                 
    if mapped_b and _is_terminal(mapped_b):                          
        result.add(mapped_b)
这个逻辑能写得更好吗?我在考虑列表理解,但由于映射b是在移动中形成的,似乎我必须多次进行,这是浪费

[result.add(b&mapped) for b in blobs if b&mapped and _is_terminal(b&mapped)]

同样值得为
if
语句使用
filter
吗?

据我所知,有(比如在Haskell中)允许临时存储
映射的\u b
结果

但是,您可以使用
map
或生成器来存储中间结果。比如:

result = {mapped_b for mapped_b in map(lambda b:b&mapped,blobs) if mapped_b and _is_terminal(mapped_b)}
请注意,我们在这里使用集合理解,非列表理解。在原始代码片段中,还可以构造一个

编辑

根据您的评论,您确实可以通过使用
过滤器来省略
if
部分,如:

result = set(filter(lambda b: b and _is_terminal(b),(b&mapped for b in blobs)))

这在语义上是等价的。一个是否比另一个更受欢迎通常是品味的一个方面。在这里,两者很容易互换。

您如何看待
result=set(过滤器(lambda b:如果b和_是_终端(b),(b在blob中映射为b))
?这是糟糕的代码吗?本身不是,但我的经验是,集合理解通常更有效(也更优雅)。Afaik
filter
将不会大大提高该过程。但是它的结果在语义上是相同的。@否:请注意,您应该在
过滤器的
lambda
中删除
if
。是的,这是一个输入错误。非常感谢您提供的所有信息。
result = set(filter(lambda b: b and _is_terminal(b),(b&mapped for b in blobs)))