Merkkijonojen luettelon (array) ehdot täyttävien elementtien poimiminen ja korvaaminen Pythonissa

liiketoiminta

Voit luoda uuden listan listasta (matriisista), jonka elementit ovat merkkijonoja, poimimalla vain tietyt ehdot täyttävät merkkijonoelementit tai suorittamalla korvauksia, muunnoksia jne., käyttämällä listakäsitteitä.

Lyhyen selostuksen jälkeen listojen ymmärrettävyydestä selitetään seuraava sisältö esimerkkikoodin avulla.

  • Louhinta sen perusteella, sisältyykö tietty merkkijono vai ei (osittainen vastaavuus).
  • Korvaa tietty merkkijono
  • Ote aloittamalla tai olla aloittamatta tietyllä merkkijonolla
  • Ote päättyen tai ei päättyen tiettyyn merkkijonoon
  • Arvioidaan ja uutetaan tapauskohtaisesti
  • Muunna isot ja pienet kirjaimet
  • Määrittää, käytetäänkö aakkos- vai numeromerkkejä, ja poimii ne.
  • Useita ehtoja
  • (tietokoneen) säännöllinen lauseke

Huomaa, että luettelot voivat tallentaa erityyppistä dataa ja eroavat selvästi matriiseista. Jos haluat käsitellä matriiseja prosesseissa, jotka vaativat muistin kokoa ja muistiosoitteita tai suurten tietojen numeerista käsittelyä, käytä arraya (standardikirjasto) tai NumPy:tä.

luetteloon sisällyttämisen merkintätapa

Kun listasta luodaan uusi lista, listakäsittelyt ovat yksinkertaisempia kirjoittaa kuin for-silmukat.

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

Jos elementti valitaan vain ehdollisella lausekkeella, sitä ei käsitellä lausekkeella, joten se on seuraavassa muodossa

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

Jos if-ehdollinen lauseke muutetaan if not-ehdolliseksi lausekkeeksi, siitä tulee negaatio, ja elementit, jotka eivät täytä ehdollista lauseketta, voidaan poimia.

Sisältää tietyn merkkijonon (osittainen vastaavuus) \ Ei sisällä: in

Kohdassa ”tietty merkkijono alkuperäisessä merkkijonossa” palaa True, jos alkuperäinen merkkijono sisältää tietyn merkkijonon. Tämä on ehdollinen lauseke.

In:n negaatio tehdään not in:llä.

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

Korvaa tietty merkkijono

Jos haluat korvata listan elementeistä koostuvan merkkijonon, käytä merkkijonomenetelmää replace() jokaiselle elementille listan ymmärrettävyysmerkinnässä.

Jos korvattavaa merkkijonoa ei ole, elementtiä ei tarvitse valita if-ehdollisessa lausekkeessa, koska se ei muutu replace()-sovelluksen avulla.

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

Jos haluat korvata koko elementin, joka sisältää tietyn merkkijonon, poimi se in-operaattorilla ja käsittele se ternäärioperaattorilla. Ternäärinen operaattori kirjoitetaan seuraavassa muodossa.
True Value if Conditional Expression else False Value

On OK, jos luettelon ymmärtämisen merkintätavan lausekeosa on ternäärinen operaattori.

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

Seuraavassa on suluissa oleva yhteenveto tuloksista. Jos et ole tottunut käyttämään sulkuja, se saattaa helpottaa ymmärtämistä ja virheiden välttämistä. Kieliopillisesti ei ole mitään ongelmaa, vaikka kirjoittaisitkin suluissa.

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

In:n käyttö ehtona on hämmentävää listan ymmärtämisen merkintätavan in kanssa, mutta se ei ole vaikeaa, jos tunnet listan ymmärtämisen merkintätavan syntaktisen muodon ja ternääriset operaattorit.

Alkaa tietyllä merkkijonolla \ doesn't start: startswith()

String-metodi startswith() palauttaa true-arvon, jos merkkijono alkaa argumentissa määritetyllä merkkijonolla.

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

Päättyy tiettyyn merkkijonoon \ ei pääty: endswith()

String-metodi endswith() palauttaa true, jos merkkijono päättyy argumentissa määritettyyn merkkijonoon.

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

Arvioidaan ja uutetaan tapauskohtaisesti

Merkkijonomenetelmillä isupper(),islower() voidaan määrittää, onko merkkijono kokonaan iso vai kokonaan pieni.

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

Muunna isot ja pienet kirjaimet

Jos haluat muuntaa kaikki merkit isoihin tai pieniin kirjaimiin, käytä merkkijonomenetelmiä upper() ja lower(). Muita metodeja ovat muun muassa capitalize(), joka tekee vain ensimmäisen kirjaimen isoksi, ja swapcase(), joka vaihtaa isoja ja pieniä kirjaimia.

Käytä ternääristä operaattoria, jos haluat käsitellä vain ehdon täyttäviä elementtejä, kuten edellä olevassa esimerkissä.

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äärittää, käytetäänkö aakkos- vai numeromerkkejä, ja poimii ne.

Merkkijonometodeilla isalpha() ja isnumeric() voidaan määrittää, onko merkkijono kokonaan aakkosellinen, numeerinen 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']

Useita ehtoja

Luettelon ymmärrettävyyden ehdollinen lauseke voi olla useita ehtoja. Myös negatiivisia ”ei”-ehtoja voidaan käyttää.

Kun käytät kolmea tai useampaa ehdollista lauseketta, on turvallisempaa sulkea jokainen ryhmä sulkuihin (), koska tulos vaihtelee järjestyksen mukaan.

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

(tietokoneen) säännöllinen lauseke

Säännölliset lausekkeet mahdollistavat erittäin joustavan käsittelyn.

Re.match():n palauttama match-olio määritetään aina todeksi, kun se arvioidaan ehdollisen lausekkeen kanssa. Jos se ei täsmää, se palauttaa None-olion, joka on epätosi ehdollisessa lausekkeessa. Jos siis haluat poimia vain ne elementit, jotka vastaavat säännöllistä lauseketta, sovella re.match():a luettelon kattavan lausekkeen ehdollisen lausekkeen osaan kuten aiemmin.

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

re.sub(), joka korvaa säännöllisen lausekkeen sovitetun osan, on myös hyödyllinen. Jos haluat poimia ja korvata vain sovitetut osat, lisää vain ”if-ehdollinen lauseke”.

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