Za ustvarjanje novega seznama iz seznama (polja), katerega elementi so nizi, z izločanjem samo tistih elementov nizov, ki izpolnjujejo določene pogoje, ali z izvajanjem zamenjav, pretvorb itd., uporabite razumevanje seznamov.
Po kratki razlagi razumevanja seznamov so naslednje vsebine razložene z vzorčno kodo.
- ekstrakcija na podlagi tega, ali je določen niz vključen ali ne (delno ujemanje)
- Zamenjajte določen niz
- Izvleček z začetkom ali nezačetkom z določenim nizom
- Izvleček po tem, ali se konča ali ne konča z določenim nizom
- Ocenjeno in izločeno za vsak primer posebej
- Pretvarjanje velikih in malih črk
- ugotovi, ali se uporabljajo abecedni ali številčni znaki, in jih izloči.
- Več pogojev
- (računalniški) regularni izraz
Upoštevajte, da lahko seznami shranjujejo različne vrste podatkov in se strogo razlikujejo od polj. Če želite z nizi ravnati v procesih, ki zahtevajo velikost pomnilnika in pomnilniške naslove ali numerično obdelavo velikih podatkov, uporabite array (standardna knjižnica) ali NumPy.
- zapis za vključitev v seznam
- Vsebuje določen niz (delno ujemanje) \ Ne vsebuje: in
- Zamenjajte določen niz
- Začne se z določenim nizom \ se ne začne: startswith()
- Konča se z določenim nizom znakov \ se ne konča: endswith()
- Ocenjeno in izločeno za vsak primer posebej
- Pretvarjanje velikih in malih črk
- ugotovi, ali se uporabljajo abecedni ali številčni znaki, in jih izloči.
- Več pogojev
- (računalniški) regularni izraz
zapis za vključitev v seznam
Pri ustvarjanju novega seznama iz seznama je razumevanje seznamov enostavnejše za pisanje kot zanke for.
[expression for any variable name in iterable object if conditional expression]
Če se element izbere le s pogojnim izrazom, se ne obdela z izrazom, zato ima naslednjo obliko
[variable name for variable name in original list if conditional expression]
Če pogojni izraz if spremenimo v pogojni izraz if not, postane negacija in elemente, ki ne izpolnjujejo pogojnega izraza, lahko izločimo.
Vsebuje določen niz (delno ujemanje) \ Ne vsebuje: in
V možnosti “določen niz v prvotnem nizu” vrne True, če prvotni niz vsebuje določen niz. To je pogojni izraz.
Zanikanje besede in se izvede z 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']
Zamenjajte določen niz
Če želite zamenjati niz elementov seznama, uporabite metodo replace() za vsak element v zapisu razumevanja seznama.
Če ni niza, ki ga je treba nadomestiti, elementa v pogojnem izrazu if ni treba izbrati, saj se z uporabo funkcije replace() ne bo spremenil.
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Če želite zamenjati celoten element, ki vsebuje določen niz, ga izločite z in in ga obdelujte s ternarnim operatorjem. Terinarni operator je zapisan v naslednji obliki.True Value if Conditional Expression else False Value
V redu je, če je izrazni del zapisa za razumevanje seznama ternarni operator.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
V oklepajih je povzetek rezultatov, ki je naveden v nadaljevanju. Če niste navajeni uporabljati oklepajev, boste morda lažje razumeli in se izognili napakam. Slovnično gledano ni težav, tudi če oklepaje zapišete v oklepajih.
[('ZZZ' if ('XXX' in s) else s) for s in l]
Uporaba in kot pogoja je zmedena z zapisom za razumevanje seznama in, vendar to ni težko, če poznate skladenjsko obliko zapisa za razumevanje seznama in ternarne operatorje.
Začne se z določenim nizom \ se ne začne: startswith()
Metoda startswith() vrne true, če se niz začne z nizom, ki je naveden v 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']
Konča se z določenim nizom znakov \ se ne konča: endswith()
Metoda endswith() vrne true, če se niz konča z nizom, navedenim v 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']
Ocenjeno in izločeno za vsak primer posebej
Metodi isupper(),islower() lahko uporabite za ugotavljanje, ali je niz sestavljen iz velikih ali malih črk.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Pretvarjanje velikih in malih črk
Če želite vse znake pretvoriti v velike ali male črke, uporabite metodi upper() in lower(). Druge metode vključujejo metodo capitalize(), ki z veliko začetnico zapiše samo prvo črko, in swapcase(), ki zamenja velike in male črke.
Če želite obdelati samo elemente, ki izpolnjujejo pogoj, tako kot v zgornjem primeru zamenjave uporabite ternarni operator.
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']
ugotovi, ali se uporabljajo abecedni ali številčni znaki, in jih izloči.
Metodi isalpha() in isnumeric() se lahko uporabljata za ugotavljanje, ali je niz v celoti črkoven, številčen 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']
Več pogojev
Pogojni izrazni del razumevanja seznamov je lahko sestavljen iz več pogojev. Uporabljajo se lahko tudi negativni pogoji “ne”.
Če uporabljate tri ali več pogojnih izrazov, je varneje, da vsako skupino zaprete v oklepaj (), saj se bo rezultat spreminjal glede na vrstni red.
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ški) regularni izraz
Regularni izrazi omogočajo zelo prilagodljivo obdelavo.
Objekt ujemanja, ki ga vrne funkcija re.match(), ko se ujema, je pri vrednotenju s pogojnim izrazom vedno opredeljen kot resničen. Če se ne ujema, vrne None, ki je v pogojnem izrazu false. Če torej želite izločiti samo elemente, ki ustrezajo regularnemu izrazu, uporabite re.match() za del pogojnega izraza v izrazu za razumevanje seznama kot prej.
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']
Uporabna je tudi funkcija re.sub(), ki nadomesti ujemajoči se del regularnega izraza. Če želite izločiti in nadomestiti samo ujemajoče se elemente, dodajte “if pogojni 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']