Para gerar uma nova lista em Python, extraindo ou eliminando apenas os elementos de uma lista existente (array) que satisfaçam determinadas condições, ou realizando substituições ou conversões, utilizar compreensões de lista.
O seguinte é explicado aqui, juntamente com o código da amostra.
- Forma básica de notação de compreensão da lista
- Aplicar o processo a todos os elementos da lista
- Extrair e eliminar elementos da lista que satisfaçam os critérios
- Substituir ou converter elementos que satisfaçam as condições da lista
Ver o artigo seguinte para exemplos específicos de listas de cordas.
- RELACIONADO:Extracção e substituição de elementos que satisfazem as condições de uma lista (matriz) de cordas em Python
Também é possível extrair aleatoriamente elementos que não satisfazem os critérios.
- RELACIONADO:Selecção aleatória de elementos a partir de uma lista em Python:
choice()
,sample()
,choices()
Note-se que as listas podem armazenar diferentes tipos de dados e são estritamente diferentes das arrays. Se quiser tratar arrays em processos que requerem tamanho de memória e endereços de memória ou processamento numérico de dados grandes, utilize array (biblioteca padrão) ou NumPy.
A seguinte lista é um exemplo
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Forma básica de notação de compreensão da lista
Ao gerar uma nova lista a partir de uma lista, as compreensões da lista são mais simples de escrever do que para loops.
[expression for any variable name in iterable object if conditional expression]
Uma expressão é aplicada a um elemento que satisfaz a expressão condicional de um objecto iterável (tal como uma lista ou tuple) e torna-se um elemento de uma nova lista. A expressão “se expressão condicional” pode ser omitida, caso em que a expressão é aplicada a todos os elementos.
Ver o artigo seguinte para mais detalhes, incluindo a notação de compreensão da lista aninhada.
- RELACIONADO:Como utilizar as compreensões da lista Python
Aplicar o processo a todos os elementos da lista
Por exemplo, se quiser aplicar algum processamento a todos os elementos de uma lista, descreva o processamento desejado na expressão de compreensão da lista acima.
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
Isto pode ser utilizado para converter entre listas de números e listas de cordas.
Extrair e eliminar elementos da lista que satisfaçam os critérios
Se o elemento só deve ser seleccionado por uma expressão condicional, não é processado por uma expressão, pelo que assume a seguinte forma
[variable name for variable name in original list if conditional expression]
É gerada uma nova lista da qual apenas os elementos que satisfazem a condição (elementos para os quais a expressão condicional é verdadeira) são extraídos.
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
Se “se a expressão condicional” for definida como “se não for expressão condicional”, torna-se uma negação, e apenas os elementos que não satisfazem a condição (elementos para os quais a expressão condicional é falsa) podem ser seleccionados e extraídos. Por outras palavras, é gerada uma nova lista a partir da qual os elementos que satisfazem a condição são removidos.
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Evidentemente, o mesmo resultado é obtido especificando a expressão condicional equivalente sem não utilizar.
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
A parte da expressão condicional pode ser de múltiplas condições. Os nots negativos também podem ser utilizados.
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
Substituir ou converter elementos que satisfaçam as condições da lista
No exemplo da extracção de elementos acima, os elementos que não satisfaziam as condições foram removidos.
Se quiser efectuar substituições, conversões, etc. apenas em elementos que satisfaçam as condições, aplique o operador ternário à parte de expressão da notação de compreensão da lista.
Em Python, o operador ternário pode ser escrito da seguinte forma
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
É um pouco complicado, mas a combinação de notação de compreensão de lista e operadores ternários é a seguinte.
[True Value if Conditional Expression else False Value for any variable name in original list]
A parte entre parênteses é o operador ternário (os parênteses não são necessários no código real).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Se qualquer nome de variável for escrito tal como para valores verdadeiros ou falsos, o valor do elemento original é utilizado tal como está. Se uma expressão for escrita, o processamento dessa expressão é aplicado.
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]