python - python 中使用 for、if 和 set 实现更好的代码结构

标签 python if-statement for-loop set

我的代码如下。它循环遍历由 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 项(在 中一次一个,在 中带有临时列表)。

或者您可以自己使用生成器:

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/

相关文章:

python - 堆叠两个不同维度的稀疏矩阵

python - 试图让程序给我一个句子中最长的单词

javascript - 为了提高循环效率,将两个 for 循环合为一个

python - 优化sympy生成的代码

c++ - 无法使用 boost::python 更改传递给 python 函数的对象

java - 替代一长串 if 语句的更好选择

mysql SELECT IF 语句与 OR

Excel 嵌套 IF 函数与 AND/OR

java - 确认 Java LinkedList "foreach"循环

javascript - 在for循环中发送post请求