Ekstrahiranje i zamjena elemenata koji zadovoljavaju uvjete popisa (niza) nizova u Pythonu

Poslovanje

Za generiranje novog popisa iz popisa (niza) čiji su elementi nizovi, izdvajanjem samo elemenata nizova koji zadovoljavaju određene uvjete, ili izvođenjem zamjena, konverzija itd., koristite shvaćanja popisa.

Nakon kratkog objašnjenja shvaćanja popisa, sljedeći sadržaji su objašnjeni s uzorkom koda.

  • Ekstrakcija na temelju je li određeni niz uključen ili ne (djelomično podudaranje)
  • Zamijenite određeni niz
  • Izdvojite tako da započnete ili ne započnete s određenim nizom
  • Izdvoj tako što završava ili ne završava određenim nizom
  • Sudio i izvlačio po slučaju
  • Pretvori velika i mala slova
  • Određuje koriste li se abecedni ili numerički znakovi i izdvaja ih
  • Višestruki uvjeti
  • (računalni) regularni izraz

Imajte na umu da popisi mogu pohranjivati ​​različite vrste podataka i da se striktno razlikuju od nizova. Ako želite rukovati nizovima u procesima koji zahtijevaju veličinu memorije i memorijske adrese ili numeričku obradu velikih podataka, koristite niz (standardna biblioteka) ili NumPy.

notacija uključivanja popisa

Kada generirate novi popis iz popisa, shvaćanje popisa je jednostavnije napisati nego za petlje.

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

Ako element treba biti odabran samo uvjetnim izrazom, on se ne obrađuje izrazom, pa poprima sljedeći oblik

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

Ako se uvjetni izraz if pretvori u ako ne uvjetni izraz, on postaje negacija, a elementi koji ne zadovoljavaju uvjetni izraz mogu se izdvojiti.

Sadrži određeni niz (djelomično podudaranje) \ Ne sadrži:in

U “određeni niz u izvornom nizu” vraća True ako izvorni niz sadrži određeni niz. Ovo je uvjetni izraz.

Negacija in se vrši s ne 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']

Zamijenite određeni niz

Ako želite zamijeniti niz elemenata popisa, koristite metodu string replace() za svaki element u zapisu za razumijevanje popisa.

Ako nema niza koji treba zamijeniti, nema potrebe za odabirom elementa u uvjetnom izrazu if jer se neće promijeniti primjenom replace().

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

Ako želite zamijeniti cijeli element koji sadrži određeni niz, izdvojite ga s in i obradite ga ternarnim operatorom. Ternarni operator je napisan u sljedećem obliku.
True Value if Conditional Expression else False Value

U redu je ako je izraz dio notacije za razumijevanje popisa ternarni operator.

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

Slijedi sažetak rezultata u zagradama. Ako niste navikli koristiti zagrade, možda će biti lakše razumjeti i izbjeći pogreške. Gramatički, nema problema čak ni ako napišete zagrade.

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

Korištenje in kao uvjet zbunjuje s zapisom za razumijevanje popisa u, ali nije teško ako ste svjesni sintaktičkog oblika zapisa za razumijevanje popisa i ternarnih operatora.

Počinje s određenim nizom \ ne počinje:startswith()

Metoda stringa startswith() vraća true ako niz počinje nizom navedenim u argumentu.

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

Završava s određenim nizom znakova \ ne završava:endswith()

Metoda stringa endswith() vraća true ako string završava nizom navedenim u argumentu.

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

Sudio i izvlačio po slučaju

Metode niza isupper(),islower() mogu se koristiti za određivanje je li niz samo velikim ili malim slovima.

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

Pretvori velika i mala slova

Ako želite sve znakove pretvoriti u velika ili mala slova, upotrijebite metode stringa upper() i lower(). Ostale metode uključuju capitalize(), koja piše velikim samo prvo slovo, i swapcase(), koja mijenja velika i mala slova.

Kao u gornjem primjeru zamjene, koristite ternarni operator ako želite obraditi samo elemente koji zadovoljavaju uvjet.

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

Određuje koriste li se abecedni ili numerički znakovi i izdvaja ih

Metode niza isalpha() i isnumeric() mogu se koristiti za određivanje je li niz abecedni, numerički itd.

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

Višestruki uvjeti

Dio uvjetnog izraza shvaćanja popisa može biti više uvjeta. Mogu se koristiti i negativni uvjeti “ne”.

Kada koristite tri ili više uvjetnih izraza, sigurnije je svaku grupu staviti u zagrade () jer će se rezultat razlikovati ovisno o redoslijedu.

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

(računalni) regularni izraz

Regularni izrazi omogućuju vrlo fleksibilnu obradu.

Objekt podudaranja koji vraća re.match() kada se podudara uvijek se utvrđuje kao istinit kada se procjenjuje pomoću uvjetnog izraza. Ako se ne podudara, vraća None, što je netočno u uvjetnom izrazu. Dakle, ako želite izdvojiti samo elemente koji odgovaraju regularnom izrazu, samo primijenite re.match() na dio uvjetnog izraza izraza za razumijevanje popisa kao i prije.

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(), koji zamjenjuje podudarni dio regularnog izraza, također je koristan. Da biste izdvojili i zamijenili samo podudarne elemente, samo dodajte “ako uvjetni izraz”.

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