A karakterláncok listájának (tömbjének) feltételeit teljesítő elemek kivonása és helyettesítése Pythonban

Üzleti

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

Amikor egy listából új listát generálunk, a listakövetelmények egyszerűbben írhatók, mint a for ciklusok.

[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']
Copied title and URL