python中的for、if和set具有更好的代码结构
我的代码如下。它循环遍历作为冻结集集的blob,并检查每个blob是否与作为集的mapped相交。如果blob确实与“已映射”相交,并且还满足“为终点”的条件,则将相交集添加到结果中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
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))
?这是糟糕的代码吗?本身不是,但我的经验是,集合理解通常更有效(也更优雅)。Afaikfilter
将不会大大提高该过程。但是它的结果在语义上是相同的。@否:请注意,您应该在过滤器的lambda
中删除if
。是的,这是一个输入错误。非常感谢您提供的所有信息。
result = set(filter(lambda b: b and _is_terminal(b),(b&mapped for b in blobs)))