2017-08-06 138 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