Extragerea și înlocuirea elementelor care îndeplinesc condițiile unei liste (array) de șiruri de caractere în Python

Afaceri

Pentru a genera o nouă listă dintr-o listă (tablou) ale cărei elemente sunt șiruri de caractere, prin extragerea numai a elementelor de șiruri de caractere care îndeplinesc anumite condiții sau prin efectuarea de substituiri, conversii etc., se utilizează înțelegerile de liste.

După o scurtă explicație a înțelegerii listelor, următorul conținut este explicat cu exemple de cod.

  • Extracție bazată pe faptul că un anumit șir de caractere este inclus sau nu (potrivire parțială)
  • Înlocuiți un anumit șir de caractere
  • Extragerea prin începerea sau nu cu un anumit șir de caractere
  • Extragere prin terminarea sau nu cu un anumit șir de caractere
  • Judecată și extrasă în funcție de caz
  • Conversia majusculelor și minusculelor
  • Determină dacă sunt utilizate caractere alfabetice sau numerice și le extrage
  • Condiții multiple
  • expresie regulată (pentru calculator)

Rețineți că listele pot stoca diferite tipuri de date și sunt strict diferite de array-uri. Dacă doriți să manipulați array-uri în procese care necesită dimensiunea memoriei și adrese de memorie sau procesarea numerică a unor date mari, utilizați array (biblioteca standard) sau NumPy.

notarea includerii în listă

Atunci când se generează o nouă listă dintr-o listă, înțelegerile de liste sunt mai simplu de scris decât buclele for.

[expression for any variable name in iterable object if conditional expression]

În cazul în care elementul trebuie să fie selectat doar printr-o expresie condițională, acesta nu este prelucrat printr-o expresie, deci are următoarea formă

[variable name for variable name in original list if conditional expression]

În cazul în care expresia condițională if este transformată într-o expresie condițională if not, aceasta devine o negație, iar elementele care nu satisfac expresia condițională pot fi extrase.

Conține un anumit șir de caractere (potrivire parțială) \ Nu conține: in

În „șir specific în șirul original”, returnează True dacă șirul original conține șirul specific. Aceasta este o expresie condiționată.

Negarea lui in se face cu 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']

Înlocuiți un anumit șir de caractere

Dacă doriți să înlocuiți un șir de elemente de listă, utilizați metoda replace() pentru fiecare element din notația de înțelegere a listei.

Dacă nu există un șir de caractere care să fie înlocuit, nu este necesar să se selecteze elementul în expresia condițională if, deoarece acesta nu va fi modificat prin aplicarea replace().

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

Dacă doriți să înlocuiți un întreg element care conține un anumit șir de caractere, extrageți-l cu in și procesați-l cu operatorul ternar. Operatorul ternar se scrie în următoarea formă.
True Value if Conditional Expression else False Value

Este în regulă dacă partea de expresie din notația de înțelegere a listei este un operator ternar.

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

În cele ce urmează este prezentat un rezumat al rezultatelor, inclus între paranteze. Dacă nu sunteți obișnuiți să folosiți paranteze, este posibil să vă fie mai ușor să înțelegeți și să evitați greșelile. Din punct de vedere gramatical, nu există nicio problemă chiar dacă scrieți paranteze.

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

Utilizarea lui in ca o condiție este confuză cu notația de înțelegere a listei in, dar nu este dificilă dacă cunoașteți forma sintactică a notației de înțelegere a listei și a operatorilor ternari.

Începe cu un anumit șir de caractere \ nu începe: startswith()

Metoda șirului de caractere startswith() returnează true dacă șirul începe cu șirul specificat în 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']

Se termină cu un anumit șir de caractere \ nu se termină: endswith()

Metoda șirului endswith() returnează true dacă șirul se termină cu șirul specificat în 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']

Judecată și extrasă în funcție de caz

Metodele de șiruri de caractere isupper(),islower() pot fi utilizate pentru a determina dacă un șir de caractere este format numai din majuscule sau numai din minuscule.

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

Conversia majusculelor și minusculelor

Dacă doriți să convertiți toate caracterele în majuscule sau minuscule, utilizați metodele de șiruri de caractere upper() și lower(). Alte metode includ capitalize(), care capitalizează doar prima literă, și swapcase(), care schimbă literele majuscule și minuscule.

La fel ca în exemplul de substituție de mai sus, utilizați operatorul ternar dacă doriți să procesați numai elementele care îndeplinesc condiția.

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']

Determină dacă sunt utilizate caractere alfabetice sau numerice și le extrage

Metodele șirurilor de caractere isalpha() și isnumeric() pot fi utilizate pentru a determina dacă un șir este în întregime alfabetic, numeric 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']

Condiții multiple

Partea de expresie condițională a înțelegerilor de liste poate avea mai multe condiții. Se pot utiliza, de asemenea, condiții negative „not”.

Atunci când utilizați trei sau mai multe expresii condiționale, este mai sigur să includeți fiecare grup între paranteze (), deoarece rezultatul va varia în funcție de ordine.

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']

expresie regulată (pentru calculator)

Expresiile regulate permit o prelucrare foarte flexibilă.

Obiectul match returnat de re.match() atunci când se potrivește este întotdeauna determinat ca fiind adevărat atunci când este evaluat cu o expresie condițională. În cazul în care nu se potrivește, acesta returnează None, care este fals în expresia condițională. Prin urmare, dacă doriți să extrageți numai elementele care se potrivesc expresiei regulate, aplicați re.match() la partea expresiei condiționale din expresia de înțelegere a listei ca mai înainte.

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(), care înlocuiește partea corespunzătoare a unei expresii regulate, este, de asemenea, utilă. Pentru a extrage și înlocui numai elementele potrivite, adăugați doar „if conditional expression”.

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']