我的代码如下。它循环遍历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
也值得一试吗?
答案 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
个项目(python-3.x一次一个,python-2.x中包含一个临时列表)。
或者您可以自己使用发电机:
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)))
这在语义上是等效的。一个人是否优先于另一个通常是品味的一个方面。这两者很容易互换。