Ha egy olyan listából (tömbből), amelynek elemei karakterláncok, új listát szeretnénk létrehozni úgy, hogy csak a bizonyos feltételeknek megfelelő karakterláncok elemeit vesszük ki, vagy helyettesítést, átalakítást stb. végzünk, használjuk a listamegértéseket.
A listamegértés rövid magyarázata után a következő tartalmak kerülnek ismertetésre példakóddal.
- Kiemelés annak alapján, hogy egy adott karakterlánc szerepel-e benne vagy sem (részleges egyezés)
- Adott karakterlánc cseréje
- Kivonatolás egy adott karakterlánccal kezdve vagy nem kezdve
- Kivonatolás egy adott karakterlánc végződésével vagy nem végződésével
- Esetenként megítélve és kivonva
- Nagybetűk és kisbetűk átalakítása
- Meghatározza, hogy alfabetikus vagy numerikus karaktereket használnak-e, és kivonja azokat.
- Többféle feltétel
- (számítógépes) reguláris kifejezés
Vegye figyelembe, hogy a listák különböző típusú adatokat tárolhatnak, és szigorúan különböznek a tömböktől. Ha olyan folyamatokban szeretnénk tömböket kezelni, amelyek memóriaméretet és memóriacímeket vagy nagyméretű adatok numerikus feldolgozását igénylik, használjuk a array (standard könyvtár) vagy a NumPy programot.
- listába foglalási jelölés
- Tartalmaz egy adott karakterláncot (részleges egyezés) \ Nem tartalmaz: in
- Adott karakterlánc cseréje
- Egy adott karakterlánccal kezdődik \ nem kezdődik: startswith()
- Egy adott karakterlánccal végződik \ nem végződik: endswith()
- Esetenként megítélve és kivonva
- Nagybetűk és kisbetűk átalakítása
- Meghatározza, hogy alfabetikus vagy numerikus karaktereket használnak-e, és kivonja azokat.
- Többféle feltétel
- (számítógépes) reguláris kifejezés
listába foglalási jelölés
Amikor egy listából új listát generálunk, a listakövetelmények egyszerűbben írhatók, mint a for ciklusok.
- KAPCSOLÓDÓ:Hogyan használjuk a Python listák megértését
[expression for any variable name in iterable object if conditional expression]
Ha az elemet csak egy feltételes kifejezéssel kell kiválasztani, akkor azt nem dolgozza fel egy kifejezés, így a következő alakot veszi fel
[variable name for variable name in original list if conditional expression]
Ha az if feltételes kifejezést if not feltételes kifejezéssé alakítjuk, akkor negációvá válik, és a feltételes kifejezésnek nem megfelelő elemek kivonhatók.
Tartalmaz egy adott karakterláncot (részleges egyezés) \ Nem tartalmaz: in
Az “adott karakterlánc az eredeti karakterláncban” esetén True értéket ad vissza, ha az eredeti karakterlánc tartalmazza az adott karakterláncot. Ez egy feltételes kifejezés.
Az in tagadása a not in segítségével történik.
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']
Adott karakterlánc cseréje
Ha egy listaelemekből álló karakterláncot szeretne kicserélni, használja a replace() karakterlánc-módszert a lista megértési jelölés minden egyes elemére.
Ha nincs kicserélendő karakterlánc, akkor nincs szükség az elem kiválasztására az if feltételes kifejezésben, mert a replace() alkalmazásával nem fog megváltozni.
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Ha egy adott karakterláncot tartalmazó teljes elemet szeretne kicserélni, akkor azt az in segítségével vegye ki, és dolgozza fel a terner operátorral. A terner operátor a következő formában írható le.True Value if Conditional Expression else False Value
Rendben van, ha a listamegértés jelölésének kifejezési része egy terner operátor.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Az alábbiakban az eredmények zárójelben szereplő összefoglalása következik. Ha nem szokott zárójeleket használni, könnyebb lehet a megértés és a hibák elkerülése. Nyelvtanilag akkor sincs probléma, ha zárójeleket írsz.
[('ZZZ' if ('XXX' in s) else s) for s in l]
Az in feltételként való használata zavaró az in listamegértési jelöléssel, de nem nehéz, ha tisztában van a listamegértési jelölés és a terner operátorok szintaktikai formájával.
Egy adott karakterlánccal kezdődik \ nem kezdődik: startswith()
A startswith() string metódus igazat ad vissza, ha a karakterlánc az argumentumban megadott karakterlánccal kezdődik.
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']
Egy adott karakterlánccal végződik \ nem végződik: endswith()
A string metódus endswith() igazat ad vissza, ha a string az argumentumban megadott stringgel végződik.
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']
Esetenként megítélve és kivonva
Az isupper(),islower() karakterlánc-módszerekkel meghatározható, hogy egy karakterlánc csak nagy vagy csak kisbetűs.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Nagybetűk és kisbetűk átalakítása
Ha az összes karaktert nagy- vagy kisbetűsre akarja konvertálni, használja az upper() és az lower() karakterlánc-módszereket. További metódusok a capitalize(), amely csak az első betűt írja nagybetűre, és a swapcase(), amely felcseréli a kis- és nagybetűket.
A fenti helyettesítési példához hasonlóan használja a terner operátort, ha csak a feltételnek megfelelő elemeket akarja feldolgozni.
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']
Meghatározza, hogy alfabetikus vagy numerikus karaktereket használnak-e, és kivonja azokat.
Az isalpha() és isnumeric() karakterlánc-módszerekkel meghatározható, hogy egy karakterlánc teljesen alfabetikus, numerikus stb. legyen.
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']
Többféle feltétel
A listamegértések feltételes kifejezés része több feltétel lehet. Negatív “nem” feltételek is használhatók.
Három vagy több feltételes kifejezés használata esetén biztonságosabb, ha minden csoportot zárójelbe () zárunk, mert az eredmény a sorrendtől függően változik.
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']
(számítógépes) reguláris kifejezés
A reguláris kifejezések rendkívül rugalmas feldolgozást tesznek lehetővé.
A re.match() által visszaadott match objektum, amikor egyezés történik, mindig igaznak minősül, ha feltételes kifejezéssel értékelik ki. Ha nem egyezik, akkor None-t ad vissza, ami a feltételes kifejezésben hamis. Ha tehát csak a reguláris kifejezésnek megfelelő elemeket akarjuk kivenni, akkor csak alkalmazzuk a re.match()-t a listát átfogó kifejezés feltételes kifejezés részéhez, mint korábban.
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']
A re.sub(), amely a reguláris kifejezés illesztett részét helyettesíti, szintén hasznos. Ha csak az illesztett elemeket szeretné kivenni és helyettesíteni, csak adja hozzá a “if feltételes kifejezés” szót.
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']