É mais sobre sintaxe de compreensão da lista python. Eu tenho uma compreensão de lista que produz lista de números ímpares de um determinado intervalo:
[x for x in range(1, 10) if x % 2]
Isso cria um filtro - eu tenho uma lista de fontes, onde removo números pares ( if x % 2
). Eu gostaria de usar algo como se-então-outro aqui. O código a seguir falha:
>>> [x for x in range(1, 10) if x % 2 else x * 100]
File "<stdin>", line 1
[x for x in range(1, 10) if x % 2 else x * 100]
^
SyntaxError: invalid syntax
Há uma expressão python como if-else:
1 if 0 is 0 else 3
Como usá-lo dentro de uma compreensão de lista?
()
vez de[]
.if x % 2
eliminados (em vez de mantê-los) - é porque quandox
é que ax % 2
expressão resulta0
, que, por sua vez, avalia comoFalse
, enquanto qualquer umint
exceto0
avaliaTrue
.Respostas:
x if y else z
é a sintaxe da expressão que você está retornando para cada elemento. Assim você precisa:A confusão surge do fato de você estar usando um filtro no primeiro exemplo, mas não no segundo. No segundo exemplo, você está mapeando apenas cada valor para outro, usando uma expressão de operador ternário.
Com um filtro, você precisa:
Sem um filtro, você precisa:
e no seu segundo exemplo, a expressão é "complexa", que envolve um
if-else
.fonte
[x for x in range(1, 10) if x % 2]
é a sintaxe correta.[x if x % 2 for x in range(1, 10)]
- isto não é, mas[x if x%2 else x*100 for x in range(1, 10)]
é novamente, sintaxe correta. Por quê?else
), nem um filtro (uma vez que é naEXP
parte da lista de compreensão)if
no final:[x if x%2 else x*100 for x in range(1, 10) if not x%3]
O primeiroif
faz parte do operador ternário, o segundoif
faz parte da sintaxe de compreensão da lista. O todox if x%2 else x*100
é "no mesmo nível" como um simples2*x
, é a expressão a ser avaliada no lado esquerdo dofor
, quando a filtragemif not x%3
já tiver ocorrido.for i in x:
e depois no loop forif i == y:
?fonte
Você também pode fazer isso com a compreensão da lista:
fonte
Apenas mais uma solução, espero que alguém goste:
Usando: [Falso, Verdadeiro] [Expressão]
fonte
Eu consegui fazer isso
fonte