Como posso fazer o seguinte em Python?
row = [unicode(x.strip()) for x in row if x is not None else '']
Essencialmente:
- substitua todos os Nones por cadeias vazias e depois
- realizar uma função.
python
list-comprehension
AP257
fonte
fonte
Respostas:
Você pode fazer isso totalmente. É apenas uma questão de pedido:
Em geral,
E, para compreensão de lista
if
apenas com condições,Observe que, na verdade, isso usa uma construção de linguagem diferente, uma expressão condicional , que por si só não faz parte da sintaxe de compreensão , enquanto
if
o quefor…in
segue faz parte das compreensões da lista e é usado para filtrar elementos da fonte iterável.Expressões condicionais podem ser usadas em todos os tipos de situações em que você deseja escolher entre dois valores de expressão com base em alguma condição. Isso faz o mesmo que o operador ternário
?:
que existe em outros idiomas . Por exemplo:fonte
l = [ 2, 3, 4, 5]
então[x if x % 2 == 0 for x in l]
me dê erro enquanto[x if x % 2 == 0 else 200 for x in l]
funciona. Sim, eu sei que para filtrar, devo escrever[ x for x in l if x % 2 == 0]
. Desculpe pela incomodação. Obrigado pela sua resposta.Mão única:
Embora você tenha:
Ou você pode usar um lambda inline.
fonte
if
expressão ou código em seuelse
bloco de instruções. A resposta aceita é melhor para casos simples.Aqui está outro exemplo ilustrativo:
Ele explora o fato de
if i
avaliarFalse
para0
eTrue
para todos os outros valores gerados pela funçãorange()
. Portanto, a compreensão da lista é avaliada da seguinte forma:fonte
O problema específico já foi resolvido nas respostas anteriores, portanto, abordarei a idéia geral de usar condicionais dentro da compreensão da lista.
Aqui está um exemplo que mostra como condicionais podem ser escritos dentro de uma compreensão de lista:
Observe que, na primeira compreensão da lista
X_non_str
, o pedido é:e na última lista de compreensão para
X_str_changed
, o pedido é:Eu sempre acho que é difícil lembrar que expresseion1 tem que ser antes de se e expressão2 tem que ser depois de outra coisa . Minha cabeça quer que ambos estejam antes ou depois.
Acho que foi projetado assim porque se assemelha à linguagem normal, por exemplo: "Quero ficar dentro de casa se chover, caso contrário , quero sair"
Em inglês simples, os dois tipos de compreensão de lista mencionados acima podem ser declarados como:
Com apenas
if
:e com
if/else
fonte
As outras soluções são excelentes para um único
if
/else
construo. No entanto, afirmações ternárias nas compreensões da lista são sem dúvida difíceis de ler.O uso de uma função ajuda na legibilidade, mas é difícil estender ou adaptar essa solução em um fluxo de trabalho em que o mapeamento é uma entrada. Um dicionário pode aliviar essas preocupações:
fonte
Tem a ver com a forma como a compreensão da lista é realizada.
Lembre-se do seguinte:
É equivalente a:
Onde o arquivo
expression
está em um formato ligeiramente diferente (pense em mudar de assunto e ordem verbal em uma frase).Portanto, seu código
[x+1 for x in l if x >= 45]
faz isso:No entanto, este código
[x+1 if x >= 45 else x+5 for x in l]
faz isso (depois de reorganizar oexpression
):fonte
Não há necessidade de ternário if / then / else. Na minha opinião, sua pergunta pede esta resposta:
fonte
Parece melhor generalizar primeiro todas as formas possíveis, em vez de dar respostas específicas a perguntas. Caso contrário, o leitor não saberá como a resposta foi determinada. Aqui estão algumas formas generalizadas que pensei antes de ficar com dor de cabeça tentando decidir se uma cláusula final poderia ser usada na última forma.
O valor de
item
não precisa ser usado em nenhuma das cláusulas condicionais. Aconditional3
pode ser usado como uma opção para adicionar ou não adicionar um valor à lista de saída.Por exemplo, para criar uma nova lista que elimine cadeias vazias ou cadeias de espaço em branco da lista original de cadeias:
fonte
this if condition else that
ou uma expressão normal é permitida. Nãovalue = this if condition
(o que pode ser alcançado comvalue = this if condition else None
) #Você pode combinar lógica condicional em uma compreensão:
fonte
(venv) $ python list_comp.py Nome
da minha lista [0, 1, 2, 3, 4, 5]
Nome da minha lista [0, 5, 4, 7, 8, 9]
Então, para você:
row = [('', unicode(x.strip()))[x is not None] for x in row]
fonte