Extracció i substitució d’elements que compleixen les condicions d’una llista (matriu) de cadenes en Python

Negocis

Per generar una llista nova a partir d’una llista (matriu) els elements de la qual són cadenes, extraient només els elements de cadenes que compleixen determinades condicions, o realitzant substitucions, conversions, etc., utilitzeu les comprensió de llista.

Després d’una breu explicació de la comprensió de les llistes, s’expliquen els continguts següents amb codi d’exemple.

  • Extracció en funció de si s’inclou o no una cadena específica (concordança parcial)
  • Substitueix una cadena específica
  • Extraieu començant o no començant per una cadena específica
  • Extraieu acabant o no amb una cadena específica
  • Jutjat i extret per cas
  • Converteix majúscules i minúscules
  • Determina si s’utilitzen caràcters alfabètics o numèrics i els extreu
  • Condicions múltiples
  • expressió regular (ordinador).

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.

notació d’inclusió 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]

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]

Si l’expressió condicional if es converteix en una expressió condicional si no, es converteix en una negació i es poden extreure elements que no compleixen l’expressió condicional.

Conté una cadena específica (concordança parcial) \ No conté:in

A “cadena específica a la cadena original”, retorna True si la cadena original conté la cadena específica. Aquesta és una expressió condicional.

La negació de in es fa amb not in.

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']

l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']

Substitueix una cadena específica

Si voleu substituir una cadena d’elements de llista, utilitzeu el mètode de cadena replace() per a cada element de la notació de comprensió de la llista.

Si no hi ha cap cadena per substituir, no cal seleccionar l’element a l’expressió condicional if perquè no es canviarà aplicant substituir().

l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']

Si voleu substituir un element sencer que conté una cadena específica, extreu-la amb in i processeu-la amb l’operador ternari. L’operador ternari s’escriu de la forma següent.
True Value if Conditional Expression else False Value

Està bé si la part d’expressió de la notació de comprensió de la llista és un operador ternari.

l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']

El següent és un resum dels resultats, inclòs entre parèntesis. Si no esteu acostumats a utilitzar parèntesis, pot ser més fàcil d’entendre i evitar errors. Gramàticament, no hi ha cap problema encara que escriviu entre parèntesis.

[('ZZZ' if ('XXX' in s) else s) for s in l]

L’ús de in com a condició és confús amb la notació de comprensió de llista in, però no és difícil si coneixeu la forma sintàctica de la notació de comprensió de llista i els operadors ternaris.

Comença amb una cadena específica \ no comença:startswith()

El mètode de cadena startswith() retorna true si la cadena comença amb la cadena especificada a l’argument.

l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']

l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']

Acaba amb una cadena de caràcters específica \ no acaba:endswith()

El mètode de cadena endswith() retorna true si la cadena acaba amb la cadena especificada a l’argument.

l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']

l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']

Jutjat i extret per cas

Els mètodes de cadena isupper(),islower() es poden utilitzar per determinar si una cadena està tota en majúscules o en minúscules.

l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']

Converteix majúscules i minúscules

Si voleu convertir tots els caràcters a majúscules o minúscules, utilitzeu els mètodes de cadena upper() i lower(). Altres mètodes inclouen capitalize(), que només posa en majúscula la primera lletra, i swapcase(), que intercanvia lletres majúscules i minúscules.

Com a l’exemple de substitució anterior, utilitzeu l’operador ternari si voleu processar només els elements que compleixin la condició.

l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']

l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']

Determina si s’utilitzen caràcters alfabètics o numèrics i els extreu

Els mètodes de cadena isalpha() i isnumeric() es poden utilitzar per determinar si una cadena és tota alfabètica, numèrica, etc.

l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']

l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']

Condicions múltiples

La part d’expressió condicional de la comprensió de llistes pot ser múltiples condicions. També es poden utilitzar condicions negatives “no”.

Quan s’utilitzen tres o més expressions condicionals, és més segur tancar cada grup entre parèntesis () perquè el resultat variarà segons l’ordre.

l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']

l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']

expressió regular (ordinador).

Les expressions regulars permeten un processament molt flexible.

L’objecte de concordança retornat per re.match() quan coincideix sempre es determina que és cert quan s’avalua amb una expressió condicional. Si no coincideix, retorna Cap, que és fals a l’expressió condicional. Per tant, si voleu extreure només els elements que coincideixen amb l’expressió regular, només cal que apliqueu re.match() a la part de l’expressió condicional de l’expressió de comprensió de la llista com abans.

import re

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']

re.sub(), que substitueix la part coincident d’una expressió regular, també és útil. Per extreure i substituir només els elements coincidents, només cal que afegiu “si expressió condicional”.

l_re_sub_all = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']

l_re_sub = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']
Copied title and URL