如何避免在这个列表理解中不必要地查询集合对象 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/