27 votes

Conditions IF multiples dans une compréhension de liste python

Je me demandais s'il était possible de mettre de multiples if conditions dans une liste de compréhension ? Je n'ai rien trouvé de tel dans la documentation.

Je veux être capable de faire quelque chose comme ceci

ar=[]
for i in range(1,n):
  if i%4 == 0: ar.append('four')
  elif i%6 == 0: ar.append('six')
  else: ar.append(i)

en utilisant une liste de compréhension. Comment puis-je le faire ?

Est-ce même possible ? Si ce n'est pas le cas, quelle serait la manière la plus élégante (pythonique) d'accomplir cela ?

45voto

David Robinson Points 33371

Et si

ar = [('four' if i % 4 == 0 else ('six' if i % 6 == 0 else i)) for i in range(1, n)]

Par exemple, si n = 30 c'est

[1, 2, 3, 'four', 5, 'six', 7, 'four', 9, 10, 11, 'four', 13, 14, 15, 'four', 17, 'six', 19, 'four', 21, 22, 23, 'four', 25, 26, 27, 'four', 29]

ETA : Voici comment vous pourriez appliquer une liste de conditions :

CONDITIONS = [(lambda i: i % 4 == 0, "four"), (lambda i: i % 6 == 0, "six"),
              (lambda i: i % 7 == 0, "seven")]

def apply_conditions(i):
    for condition, replacement in CONDITIONS:
        if condition(i):
            return replacement
    return i

ar = map(apply_conditions, range(0, n))

15voto

dawg Points 26051

Vous pouvez placer votre logique dans une fonction distincte, et ainsi bénéficier de l'élégance de la compréhension de la liste tout en conservant la lisibilité de la fonction :

def cond(i):
    if i % 4 == 0: return 'four'
    elif i % 6 == 0: return 'six'

    return i

l=[cond(i) for i in range(1,n)]

Si vous avez beaucoup de conditions, il est généralement plus facile de gérer une seule dictée plutôt qu'une grande échelle if/else :

def cond(i):
    mkey={4:'four',6:'six'}
    return next((mkey[k] for k in mkey if i%k == 0), i)

Ceci utilise la version par défaut de next pour trouver si une clé entière est un multiple de cette clé ou du nombre lui-même, la valeur par défaut, si non.

Qui pourrait être une compréhension unique si on le souhaite :

[next((v for k,v in {4:'four',6:'six'}.items() if i%k==0), i) for i  in range(1,10)]

5voto

RyanAbnavi Points 171
ar = ["four" if i%4==0 else "six" if i%6==0  else i for i in range(1,30)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X