使用for,if和python设置更好的代码结构

时间:2017-02-16 13:12:21

标签: python if-statement for-loop set

我的代码如下。它循环遍历blob,它是一组冷冻集并检查每个blob是否与映射相交,这是一个集合。如果blob与映射相交并且还满足终止条件,则将交集添加到结果中。

result = set()
for b in blobs:                                                   
    mapped_b = b & mapped                                                 
    if mapped_b and _is_terminal(mapped_b):                          
        result.add(mapped_b)

这种逻辑可以用更好的方式编写吗?我正在考虑列表理解,但由于mapped_b是在移动中形成的,似乎我必须多次使用才浪费。

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

filter语句使用if也值得一试吗?

1 个答案:

答案 0 :(得分:3)

据我所知,有no such thing as a let statement(例如在Haskell中)允许临时存储mapped_b结果。

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

result = {mapped_b for mapped_b in map(lambda b:b&mapped,blobs) if mapped_b and _is_terminal(mapped_b)}

因此,map(lambda b:b&mapped,blobs)将生成mapped_b个项目(一次一个,中包含一个临时列表)。

或者您可以自己使用发电机:

result = {mapped_b for mapped_b in (b&mapped for b in blobs) if mapped_b and _is_terminal(mapped_b)}

请注意,我们这里使用 设置 理解 not list 理解。在原始代码片段中,您还构造了set

修改

根据您的评论,您确实可以使用if来省略filter部分:

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

这在语义上是等效的。一个人是否优先于另一个通常是品味的一个方面。这两者很容易互换。