1
votes

Pourquoi est-ce que j'obtiens une liste vide au lieu de [0] lorsque N = 1

Je travaille sur la compréhension de liste

[0 if N<2 else val*2 for val in range(0,N//2)]

quand N


0 commentaires

5 Réponses :


2
votes

Voici comment votre expression est lue du point de vue de l'ordinateur.

[0] if N < 2 else [val * 2 for val in range(0, N // 2)]

Le bit for se produit donc en premier. Et si N est inférieur à 2 , alors range (0, N // 2) est vide, donc le 0 si N bit ne s'exécute jamais réellement.

Dans votre cas, il serait plus logique d'avoir simplement deux cas différents.

if N < 2:
  return [0]
else:
  return [val * 2 for val in range(0, N // 2)]

Ou, si vous le souhaitez en une seule ligne,

[(0 if N < 2 else val * 2) for val in range(0, N // 2)]


0 commentaires

3
votes

Si N = 1 , alors N // 2 = 0 . Donc, votre boucle for n'est pas en cours d'exécution, car ce serait une plage de 0 à 0. Vous pouvez faire [val * 2 pour val in range (0, N // 2)] si N> = 2 else [0 ]


0 commentaires

0
votes

1 // 2 vaut 0, donc vous avez range (0, 0) qui est une liste vide, donc la partie map de la compréhension de liste n'est pas exécutée du tout.

Si vous voulez obtenir [0 ] pour N

[val*2 for val in range(0,N//2)] if N<2 else [0]


0 commentaires

0
votes

cela fonctionne pour moi. essayez ce qui suit:

N = 3
a = [0 if N<2 else val*2 for val in range(0,N//2)]
#output: [0]


0 commentaires

0
votes

Ou faire une indexation de liste:

print({0:[val * 2 for val in range(0, N // 2)],1:[0]}.get(N<2))

Ou dict.get:

print([[val * 2 for val in range(0, N // 2)],[0]][N<2])

Les deux reproduisent le résultat.


0 commentaires