Per generar una llista nova a Python extraient o suprimint només aquells elements d’una llista existent (matriu) que compleixin determinades condicions, o fent substitucions o conversions, utilitzeu les comprensió de llista.
Aquí s’explica el següent, juntament amb el codi d’exemple.
- Forma bàsica de notació de comprensió de llista
- Apliqueu el procés a tots els elements de la llista
- Extraieu i suprimiu elements de la llista que compleixin els criteris
- Substituir o convertir elements que compleixin les condicions de la llista
Consulteu l’article següent per obtenir exemples específics de llistes de cadenes.
- RELACIONATS:Extracció i substitució d’elements que compleixen les condicions d’una llista (matriu) de cadenes en Python
També és possible extreure aleatòriament elements que no compleixen els criteris.
Tingueu en compte que les llistes poden emmagatzemar diferents tipus de dades i són estrictament diferents de les matrius. Si voleu gestionar matrius en processos que requereixen mida de memòria i adreces de memòria o processament numèric de dades grans, utilitzeu array (biblioteca estàndard) o NumPy.
La llista següent és un exemple
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Forma bàsica de notació de comprensió de llista
Quan es genera una llista nova a partir d’una llista, la comprensió de la llista és més senzilla d’escriure que els bucles for.
[expression for any variable name in iterable object if conditional expression]
Una expressió s’aplica a un element que compleix l’expressió condicional d’un objecte iterable (com una llista o una tupla) i es converteix en un element d’una llista nova. L'”expressió condicional si” es pot ometre, en aquest cas l’expressió s’aplica a tots els elements.
Consulteu l’article següent per obtenir més detalls, inclosa la notació de comprensió de llistes imbricades.
- RELACIONATS:Com utilitzar la comprensió de llistes de Python
Apliqueu el procés a tots els elements de la llista
Per exemple, si voleu aplicar algun processament a tots els elements d’una llista, descriu el processament desitjat a l’expressió de comprensió de la llista 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']
Això es pot utilitzar per convertir entre llistes de números i llistes de cadenes.
Extraieu i suprimiu elements de la llista que compleixin els criteris
Si l’element només s’ha de seleccionar per una expressió condicional, no es processa per una expressió, de manera que pren la forma següent
[variable name for variable name in original list if conditional expression]
Es genera una nova llista de la qual només s’extreuen els elements que compleixen la condició (elements per als quals l’expressió condicional és certa).
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]
Si “si expressió condicional” s’estableix a “si no expressió condicional”, es converteix en una negació i només es poden seleccionar i extreure els elements que no compleixen la condició (elements per als quals l’expressió condicional és falsa). És a dir, es genera una nova llista de la qual s’eliminen els elements que compleixen la condició.
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]
Per descomptat, el mateix resultat s’obté especificant l’expressió condicional equivalent sense utilitzar not.
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]
La part d’expressió condicional pot ser múltiples condicions. També es poden utilitzar els no negatius.
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 o convertir elements que compleixin les condicions de la llista
En l’exemple d’extracció d’elements anterior, es van eliminar els elements que no complien les condicions.
Si només voleu realitzar substitucions, conversions, etc. en elements que compleixin les condicions, apliqueu l’operador ternari a la part d’expressió de la notació de comprensió de la llista.
A Python, l’operador ternari es pot escriure de la següent manera
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
És una mica complicat, però la combinació de notació de comprensió de llistes i operadors ternaris és la següent.
[True Value if Conditional Expression else False Value for any variable name in original list]
La part tancada entre parèntesis és l’operador ternari (els parèntesis no són necessaris al codi real).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Si qualsevol nom de variable s’escriu tal com és per a valors vertaders o falsos, el valor de l’element original s’utilitza tal qual. Si s’escriu una expressió, s’aplica el processament d’aquesta expressió.
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]