我的代码如下。它循环遍历由 freezeset 组成的 blob,并检查每个 blob 是否与作为集合的映射相交。如果一个blob确实与mapped相交并且也满足终止条件,则将交集添加到结果中。
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)]
另外,在 if
语句中使用 filter
值得吗?
最佳答案
据我所知,有no such thing as a let
statement (例如在 Haskell 中)这将允许临时存储 mapped_b
结果。
但是,您可以使用map
或生成器来存储中间结果。喜欢:
result = {mapped_b for <b>mapped_b in map(lambda b:b&mapped,blobs)</b> 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>(b&mapped for b in blobs)</b> if mapped_b and _is_terminal(mapped_b)}
请注意,我们在这里使用集合理解,非列表理解。在原始代码片段中,您还构造了一个集合
。
编辑:
根据您的评论,您确实可以使用 filter
省略 if
部分,例如:
result = set(filter(lambda b: b and _is_terminal(b),(b&mapped for b in blobs)))
这在语义上是等价的。是否更喜欢其中一个通常是品味的一个方面。在这里,两者可以轻松互换。
关于python - python 中使用 for、if 和 set 实现更好的代码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42274974/