Stringide loendi (massiivi) tingimustele vastavate elementide väljavõtmine ja asendamine Pythonis

Äri

Uue loendi genereerimiseks loendist (massiivist), mille elemendid on stringid, eraldades ainult teatud tingimustele vastavad stringide elemendid või tehes asendusi, teisendusi jne, kasutage loendi mõistmist.

Pärast lühikest selgitust loendi mõistmise kohta selgitatakse järgmise sisu koos näidiskoodiga.

  • Ekstraheerimine selle põhjal, kas konkreetne string sisaldub või mitte (osaline kokkulangevus)
  • Asendada konkreetne string
  • Väljavõte, alustades või mitte alustades konkreetse stringiga
  • Väljavõte, mis lõpeb või ei lõpe kindla stringiga
  • Kohtuotsused ja väljavõtted juhtumite kaupa
  • Suurte ja väikeste tähtede teisendamine
  • Määratleb, kas kasutatakse tähestikulisi või numbrilisi märke, ja eraldab need.
  • Mitmesugused tingimused
  • (arvuti) regulaaravaldis

Pange tähele, et loendid võivad salvestada eri tüüpi andmeid ja erinevad rangelt massiividest. Kui soovite käsitleda massiive protsessides, mis nõuavad mälu suurust ja mäluaadressi või suurte andmete numbrilist töötlemist, kasutage array (standardraamatukogu) või NumPy.

nimekirja lisamise märkimine

Kui loendist genereeritakse uus loend, on loendikäsitlusi lihtsam kirjutada kui for-silmuseid.

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

Kui elementi soovitakse valida ainult tingimusliku väljendi abil, siis seda ei töödelda väljendi abil, nii et see võtab järgmise kuju

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

Kui if-tingimusavaldusest tehakse if not-tingimusavaldus, muutub see eituseks ja elemendid, mis ei vasta tingimusavaldusele, saab välja võtta.

Sisaldab konkreetset stringi (osaline kokkulangevus) \ Ei sisalda: in

Failis “konkreetne string algses stringis” tagastab True, kui algne string sisaldab konkreetset stringi. See on tingimuslik väljendus.

In'i eitamine toimub not in'iga.

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

Asendada konkreetne string

Kui soovite asendada loendi elementide stringi, kasutage stringi meetodit replace() iga elemendi jaoks loendi mõistes.

Kui asendatavat stringi ei ole, ei ole vaja valida elementi if-tingimusavalduses, sest seda ei muudeta replace() rakendamisega.

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

Kui soovite asendada kogu elementi, mis sisaldab konkreetset stringi, siis eraldage see in-ga ja töötle seda ternaarse operaatoriga. Ternaarne operaator kirjutatakse järgmisel kujul.
True Value if Conditional Expression else False Value

See on OK, kui loetelu mõistmise notatsiooni väljendusosa on kolmikoperaator.

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

Järgnevalt on esitatud sulgudes tulemuste kokkuvõte. Kui te ei ole harjunud sulgude kasutamisega, võib see olla lihtsam mõista ja vältida vigu. Grammatiliselt ei ole probleemi isegi siis, kui kirjutate sulgudes.

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

In kasutamine tingimusena on segadust tekitav koos loendi mõistmise notatsiooniga in, kuid see ei ole keeruline, kui olete teadlik loendi mõistmise notatsiooni ja ternaarse operaatori süntaktilisest vormist.

Algab konkreetse stringiga \ ei alga: startswith()

String-metoodika startswith() tagastab true, kui string algab argumendis määratud stringiga.

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

Lõpeb kindla märgijoonega \ ei lõpe: endswith()

String-metoodika endswith() tagastab true, kui string lõpeb argumendis määratud stringiga.

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

Kohtuotsused ja väljavõtted juhtumite kaupa

Stringi meetodeid isupper(),islower() saab kasutada selleks, et määrata, kas string on ainult suur- või ainult väiketähtedega.

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

Suurte ja väikeste tähtede teisendamine

Kui soovite teisendada kõik tähemärgid suur- või väiketähtedeks, kasutage stringi meetodeid upper() ja lower(). Teised meetodid on capitalize(), mis muudab ainult esimese tähe suurtähe suurtäheks, ja swapcase(), mis vahetab suur- ja väiketähed.

Nagu ülaltoodud asenduse näites, kasutage kolmikoperaatorit, kui soovite töödelda ainult neid elemente, mis vastavad tingimusele.

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

Määratleb, kas kasutatakse tähestikulisi või numbrilisi märke, ja eraldab need.

Stringimeetodite isalpha() ja isnumeric() abil saab kindlaks teha, kas string on tähestikuline, numbriline jne.

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

Mitmesugused tingimused

Loetelu mõistete tingimuslike väljendite osa võib olla mitu tingimust. Võib kasutada ka negatiivseid “ei” tingimusi.

Kolme või enama tingimusavalduse kasutamisel on turvalisem iga rühma sulgudesse () sulgeda, sest tulemus muutub sõltuvalt järjekorrast.

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

(arvuti) regulaaravaldis

Regulaaravaldised võimaldavad väga paindlikku töötlemist.

Kui re.match() tagastab sobitamise objekt, määratakse see alati tõeseks, kui seda hinnatakse tingimusliku väljendi abil. Kui see ei vasta, siis tagastatakse None, mis on tingimusliku väljendi puhul false. Seega, kui soovite eraldada ainult regulaaravaldisele vastavaid elemente, siis rakendage re.match() listi mõistmisavalduse tingimusavalduse osale nagu varemgi.

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

Kasulik on ka re.sub(), mis asendab regulaaravaldise sobiva osa. Ainult sobitatud elementide väljavõtmiseks ja asendamiseks lisage lihtsalt “if tingimusavalduse”.

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