python - 避免在此列表理解中出现冗余

标签 python list-comprehension

如何避免在这个列表理解中不必要地查询集合对象 sol?目前,我为每个对象查询两次,一次在三元中,一次在谓词中。但是,我想不出更优雅的解决方案。有吗?

dnf = (
    (
        (
            d if p[i,d,True] in sol
            else
            -d if p[i,d,False] in sol
        )
        for d in range(N)
        if p[i,d,True] in sol or p[i,d,False] in sol
    )
    for i in range(M)
)

最佳答案

您可以使用 None 识别这种情况并将其过滤掉:

dnf = (
    (
        x for x in (
            d if p[i,d,True] in sol else
            -d if p[i,d,False] in sol else None
            for d in range(N)
        )
        if x is not None
    )
    for i in range(M)
)

或以各种方式之一链接可迭代对象:

dnf = (
    (
        x
        for d in range(N)
        for x in (
            (d,) if p[i,d,True] in sol else
            (-d,) if p[i,d,False] in sol else ()
        )
    )
    for i in range(M)
)

但是您是否考虑过使用函数来代替?

def get_dnf(N, p, sol, i):
    for d in range(N):
        if p[i,d,True] in sol:
            yield d
        elif p[i,d,False] in sol:
            yield -d


dnf = (get_dnf(N, p, sol, i) for i in range(M))

关于python - 避免在此列表理解中出现冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45533003/

相关文章:

Python:在理解中重复函数调用的更好解决方案

Python 使用 takewhile 将 for/while 转换为列表理解

haskell - 如何生成从最短到最长的所有可能字符串的列表

python - 使用列表理解对数据帧的子集进行切片

扫描字符串文字时的 Python EOL

python - C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中没有

python - 计算列表中所有大于或等于 50 的数字的平均值?

来自相机的 Python OpenCV 流 - 多线程,时间戳

python - 将两行 csv 合并为一行

python - 权限和 Fusion Table API