2017-08-06 1 views
2

Comment éviter d'interroger l'objet sol inutilement dans cette liste de compréhension? Actuellement, je l'interroge deux fois pour chaque objet, une fois dans le ternaire et une fois dans le prédicat. Cependant, je ne peux pas penser à une solution plus élégante. Est-ce qu'il y a un?Éviter la redondance dans cette compréhension de liste

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

Pouvez-vous nous montrer sol? – MishaVacic

+0

@MishaVacic 'sol' est un ensemble arbitraire d'entiers. 'p' est un dictionnaire arbitraire à valeurs entières. –

+0

Avez-vous essayé de dérouler votre générateur et de le regarder de cette façon? – wwii

Répondre

7

Vous pouvez identifier ce cas avec None et filtrer sur:

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

ou chaîne iterables dans l'une des différentes façons:

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

Mais avez-vous considéré comme une fonction à la place?

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

Je vote pour la fonction de générateur: pourquoi essayer de vous torturer pour déterminer comment faire une expression/compréhension de générateur? – wwii