2017-08-06 79 views
2

如何避免查询设置对象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) 
) 
+0

你能告诉我们吗? – MishaVacic

+0

@MishaVacic'sol'是一组任意整数。 'p'是一个任意的整数值字典。 –

+0

您是否尝试解开发电机并以这种方式观察? – wwii

回答

7

您可以识别这种情况下,与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) 
) 

或链条iterables以多种方式之一:

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)) 
+2

我投票发电机功能:为什么试图折磨自己搞清楚如何使发电机表达/理解? – wwii