Na vytvorenie nového zoznamu zo zoznamu (poľa), ktorého prvkami sú reťazce, vyňatím len tých prvkov reťazcov, ktoré spĺňajú určité podmienky, alebo vykonaním substitúcií, konverzií atď., použite porozumenie zoznamu.
Po stručnom vysvetlení pojmov zoznam comprehensions je vysvetlený nasledujúci obsah so vzorovým kódom.
- Extrakcia na základe toho, či je alebo nie je zahrnutý určitý reťazec (čiastočná zhoda)
- Nahradiť konkrétny reťazec
- Výpis podľa toho, či začína alebo nezačína konkrétnym reťazcom
- Výpis podľa ukončenia alebo neukončenia konkrétneho reťazca
- Posudzované a extrahované podľa prípadu
- Prevod veľkých a malých písmen
- Určí, či sa používajú abecedné alebo číselné znaky, a extrahuje ich
- Viaceré podmienky
- (počítačový) regulárny výraz
Všimnite si, že zoznamy môžu uchovávať rôzne typy údajov a striktne sa líšia od polí. Ak chcete pracovať s poliami v procesoch, ktoré vyžadujú veľkosť pamäte a pamäťové adresy alebo numerické spracovanie veľkých dát, použite array (štandardná knižnica) alebo NumPy.
- zápis zaradenia do zoznamu
- Obsahuje špecifický reťazec (čiastočná zhoda) \ Neobsahuje: in
- Nahradiť konkrétny reťazec
- Začína konkrétnym reťazcom \ nezačína: startswith()
- Končí špecifickým reťazcom znakov \ nekončí: endswith()
- Posudzované a extrahované podľa prípadu
- Prevod veľkých a malých písmen
- Určí, či sa používajú abecedné alebo číselné znaky, a extrahuje ich
- Viaceré podmienky
- (počítačový) regulárny výraz
zápis zaradenia do zoznamu
Pri generovaní nového zoznamu zo zoznamu sa zoznam comprehensions píše jednoduchšie ako cykly for.
- SÚVISIACE:Ako používať zoznamy jazyka Python
[expression for any variable name in iterable object if conditional expression]
Ak má byť prvok vybraný iba podmieneným výrazom, nie je spracovaný výrazom, takže má nasledujúci tvar
[variable name for variable name in original list if conditional expression]
Ak sa podmienený výraz if zmení na podmienený výraz if not, stane sa z neho negácia a prvky, ktoré nespĺňajú podmienený výraz, možno vyňať.
Obsahuje špecifický reťazec (čiastočná zhoda) \ Neobsahuje: in
V položke „konkrétny reťazec v pôvodnom reťazci“ vráti hodnotu True, ak pôvodný reťazec obsahuje konkrétny reťazec. Ide o podmienený výraz.
Negácia in sa vykonáva pomocou 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']
Nahradiť konkrétny reťazec
Ak chcete nahradiť reťazec prvkov zoznamu, použite reťazcovú metódu replace() pre každý prvok v zápise porozumenia zoznamu.
Ak neexistuje reťazec, ktorý sa má nahradiť, nie je potrebné vybrať prvok v podmienenom výraze if, pretože sa použitím funkcie replace() nezmení.
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Ak chcete nahradiť celý prvok, ktorý obsahuje určitý reťazec, extrahujte ho pomocou in a spracujte ho pomocou ternárneho operátora. Ternárny operátor sa zapisuje v nasledujúcom tvare.True Value if Conditional Expression else False Value
Je v poriadku, ak je výrazovou časťou zápisu porozumenia zoznamu ternárny operátor.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Nasledujúci prehľad výsledkov je uvedený v zátvorkách. Ak nie ste zvyknutí používať zátvorky, môže to byť pre vás jednoduchšie na pochopenie a vyhnutie sa chybám. Z gramatického hľadiska nie je problém, ani keď napíšete zátvorky.
[('ZZZ' if ('XXX' in s) else s) for s in l]
Použitie in ako podmienky je mätúce v súvislosti so zoznamovým zápisom in, ale nie je to zložité, ak poznáte syntaktickú podobu zoznamového zápisu a ternárnych operátorov.
Začína konkrétnym reťazcom \ nezačína: startswith()
Reťazcová metóda startswith() vráti true, ak reťazec začína reťazcom zadaným v argumente.
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čí špecifickým reťazcom znakov \ nekončí: endswith()
Metóda endswith() vracia true, ak reťazec končí reťazcom zadaným v argumente.
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']
Posudzované a extrahované podľa prípadu
Metódy isupper(),islower() možno použiť na určenie, či je reťazec písaný veľkými alebo malými písmenami.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Prevod veľkých a malých písmen
Ak chcete previesť všetky znaky na veľké alebo malé písmená, použite metódy upper() a lower(). Medzi ďalšie metódy patria capitalize(), ktorá píše veľké písmená len na prvom mieste, a swapcase(), ktorá zamieňa veľké a malé písmená.
Podobne ako v príklade substitúcie vyššie, ak chcete spracovať len prvky, ktoré spĺňajú podmienku, použite trojčlenný operátor.
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']
Určí, či sa používajú abecedné alebo číselné znaky, a extrahuje ich
Metódy isalpha() a isnumeric() možno použiť na určenie, či je reťazec celý abecedný, číselný atď.
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']
Viaceré podmienky
Súčasťou podmieneného výrazu v zoznamoch môže byť viacero podmienok. Možno použiť aj záporné podmienky „nie“.
Pri použití troch alebo viacerých podmienených výrazov je bezpečnejšie uzavrieť každú skupinu do zátvoriek (), pretože výsledok sa bude líšiť v závislosti od poradia.
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']
(počítačový) regulárny výraz
Regulárne výrazy umožňujú veľmi flexibilné spracovanie.
Objekt zhody vrátený funkciou re.match(), keď sa zhoduje, je vždy určený ako pravdivý, keď sa vyhodnotí pomocou podmieneného výrazu. Ak sa nezhoduje, vráti None, čo je nepravda v podmienenom výraze. Ak teda chcete extrahovať len prvky, ktoré vyhovujú regulárnemu výrazu, stačí aplikovať re.match() na časť podmieneného výrazu výrazu pre pochopenie zoznamu ako predtým.
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']
Užitočná je aj funkcia re.sub(), ktorá nahrádza zodpovedajúcu časť regulárneho výrazu. Ak chcete extrahovať a nahradiť iba zhodné prvky, stačí pridať „if podmienený výraz“.
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']