Para xerar unha nova lista en Python extraendo ou eliminando só aqueles elementos dunha lista existente (matriz) que cumpran determinadas condicións, ou realizando substitucións ou conversións, use as listas de comprensión.
O seguinte explícase aquí, xunto co código de mostra.
- Forma básica de notación de comprensión de listas
- Aplique o proceso a todos os elementos da lista
- Extrae e elimina elementos da lista que cumpran os criterios
- Substituír ou converter elementos que cumpran as condicións da lista
Consulte o seguinte artigo para ver exemplos específicos de listas de cadeas.
- RELACIONADO:Extraer e substituír elementos que cumpran as condicións dunha lista (matriz) de cadeas en Python
Tamén é posible extraer aleatoriamente elementos que non cumpren os criterios.
- RELACIONADO:Seleccionando aleatoriamente elementos dunha lista en Python:
choice()
,sample()
,choices()
Teña en conta que as listas poden almacenar diferentes tipos de datos e son estrictamente diferentes das matrices. Se quere manexar matrices en procesos que requiren tamaño de memoria e enderezos de memoria ou procesamento numérico de grandes datos, use array (biblioteca estándar) ou NumPy.
A seguinte lista é un exemplo
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Forma básica de notación de comprensión de listas
Ao xerar unha nova lista a partir dunha lista, as comprensións de listas son máis sinxelas de escribir que para os bucles.
[expression for any variable name in iterable object if conditional expression]
Unha expresión aplícase a un elemento que satisfaga a expresión condicional dun obxecto iterable (como unha lista ou unha tupla) e convértese nun elemento dunha nova lista. Pódese omitir a “expresión condicional if”, nese caso a expresión aplícase a todos os elementos.
Consulte o seguinte artigo para obter máis detalles, incluída a notación de comprensión de listas aniñadas.
- RELACIONADO:Como usar as listas de comprensión de Python
Aplique o proceso a todos os elementos da lista
Por exemplo, se quere aplicar algún procesamento a todos os elementos dunha lista, describa o procesamento desexado na expresión de comprensión da lista anterior.
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 pódese usar para converter entre listas de números e listas de cadeas.
Extrae e elimina elementos da lista que cumpran os criterios
Se o elemento só debe seleccionarse mediante unha expresión condicional, non se procesará mediante unha expresión, polo que toma a seguinte forma
[variable name for variable name in original list if conditional expression]
Xérase unha nova lista da que só se extraen os elementos que cumpren a condición (elementos para os que a expresión condicional é verdadeira).
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 expresión condicional” se define como “se non expresión condicional”, convértese nunha negación e só se poden seleccionar e extraer os elementos que non cumpren a condición (elementos para os que a expresión condicional é falsa). Noutras palabras, xérase unha nova lista da que se eliminan os elementos que cumpren a condición.
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]
Por suposto, o mesmo resultado obtense especificando a expresión condicional equivalente sen usar non.
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 de expresión condicional pode ser varias condicións. Tamén se poden usar notas negativas.
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]
Substituír ou converter elementos que cumpran as condicións da lista
No exemplo de extracción de elementos anterior, elimináronse os elementos que non cumprían as condicións.
Se desexa realizar substitucións, conversións, etc. só en elementos que cumpran as condicións, aplique o operador ternario á parte de expresión da notación de comprensión da lista.
En Python, o operador ternario pódese escribir do seguinte xeito
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
É un pouco complicado, pero a combinación de notación de comprensión de lista e operadores ternarios é a seguinte.
[True Value if Conditional Expression else False Value for any variable name in original list]
A parte entre parénteses é o operador ternario (os parénteses non son necesarios no código real).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Se algún nome de variable se escribe tal e como está para valores verdadeiros ou falsos, o valor do elemento orixinal utilízase tal e como está. Se se escribe unha expresión, aplícase o procesamento desa expresión.
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]