python中for、if和set的更好的代码结构

2024-03-29 10:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码如下。它循环遍历由frozenset组成的blob,并检查每个blob是否与mapped(一个集合)相交。如果一个blob与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)]

同样值得为filter语句使用if吗?你知道吗


Tags: and代码inadd终端forifis
1条回答
网友
1楼 · 发布于 2024-03-29 10:01:22

据我所知,有no such thing as a ^{} 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)}

注意,我们这里使用的是集合理解,不是列表理解。在原始代码片段中,还构造了set。你知道吗

编辑:

根据您的评论,您确实可以使用filter这样的if部分:

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

这在语义上是等价的。一个是否比另一个更受欢迎通常是品味的一个方面。在这里两者很容易互换。你知道吗

相关问题 更多 >