Stringide võrdlemine Pythoni abil

Pythonis on stringid märgijadad, mis salvestatakse tõhusalt mällu objektina. Iga objekti saab tuvastada kasutades id() meetodit, nagu näete allpool. Python proovib mälus olevaid sama väärtusega objekte uuesti kasutada, mis muudab Pythonis ka objektide võrdlemise väga kiireks:

$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "abc"
>>> b = "abc"
>>> c = "def"
>>> print (id(a), id(b), id(c))
(139949123041320, 139949123041320, 139949122390576)
>>> quit()

Stringide võrdlemiseks pakub Python selleks mõnda erinevat operaatorit. Esiteks selgitame neid allpool üksikasjalikumalt. Teiseks käsitleme mõlemat string ja re moodulid, mis sisaldavad meetodeid tõstutundlike ja ebatäpsete vastete käsitlemiseks. Kolmandaks, tegeleda mitmerealiste stringidega difflib moodul on päris käepärane. Mitmed näited aitavad teil mõista, kuidas neid kasutada.

Võrrelge strnge == ja != operaatoritega

Põhilise võrdlusoperaatorina soovite kasutada == ja !=. Need töötavad täpselt samamoodi nagu täisarvude ja ujuvväärtuste puhul. The == operaator tagastab True kui on täpne vaste, muidu False tagastatakse. Seevastu != operaator tagastab True kui vastet pole ja muidu naaseb False. Nimekiri 1 demonstreerib seda.

Aastal for loop, võrreldakse Šveitsi linna nime "Lausanne" sisaldavat stringi teiste kohtade loendi kirjega ja võrdlustulemus trükitakse stdout-le.

Nimekiri 1:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print (f"comparing {place} with {currentCity}: %{place == currentCity}")

Pythoni skripti käivitamine väljundi ülalt on järgmine:

$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True

. == ja is Ettevõtjad

Pythonil on kaks võrdlusoperaatorit == ja is. Esmapilgul tunduvad nad olevat ühesugused, kuid tegelikult nad ei ole.

== võrdleb kahte muutujat nende esindatava väärtuse alusel. Seevastu is operaator võrdleb kahte muutujat mälus oleva objekti ID alusel.

John (Doe) ja John (Moe) on mõlemad kutsutud Johniks. Kui suudame nad taandada ainult nende nimedele, oleksid nad väärtuselt võrdsed, kuid siiski kvalitatiivselt kaks erinevat inimest.

Järgmine näide demonstreerib seda kolme stringiväärtustega muutuja puhul. Kaks muutujat a ja b on sama väärtusega ja Python viitab mälukasutuse minimeerimiseks samale objektile.

Seda tehakse vaikimisi lihtsate tüüpide ja stringide puhul, kuid mitte muude objektide puhul:

>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>> 

Niipea kui väärtus muutub, taastab Python objekti ja määrab muutuja. Järgmises koodilõigul b saab väärtuse 2 ja seejärel b ja c viitavad samale objektile:

>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416

Rohkem võrdlusoperaatoreid

Leksikograafilise järjestuse võrdlemiseks võite kasutada võrdlusoperaatoreid <, >, <=ja >=. Võrdlus ise toimub karakterite kaupa. Järjekord sõltub tähemärkide järjekorrast tähestikus. See järjekord sõltub märgitabelist, mida teie arvutis Pythoni koodi täitmisel kasutatakse.

Pidage meeles, et järjekord on tõstutundlik. Ladina tähestiku näitena tuleb "buss" enne "bussi". Nimekiri 2 näitab, kuidas need võrdlusoperaatorid praktikas töötavad.

Nimekiri 2:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    if place < currentCity:
            print (f"{place} comes before {currentCity}")
    elif place > currentCity:
            print (f"{place} comes after {currentCity}")
    else:
            print (f"{place} is equal to {currentCity}")

Pythoni skripti käivitamine väljundi ülalt on järgmine:

$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne

Tõstutundlikud stringide võrdlused

Eelmised näited keskendusid stringide täpsetele vastetele. Tõstutundlike võrdluste võimaldamiseks pakub Python spetsiaalseid stringimeetodeid, nagu upper() ja lower(). Mõlemad on otse kättesaadavad vastava stringiobjekti meetoditena.

upper() teisendab kogu stringi suurtähtedeks ja lower() vastavalt väiketähtedega. Põhineb Nimekiri 1 järgmine loend näitab, kuidas kasutada lower() meetod.

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

Nimekiri 3:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")

Väljund on järgmine:

$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True

Stringide võrdlemine regulaaravaldiste abil (RegEx)

A Regular Expression – või lühidalt “regex” – määratleb kindla märkide mustri.

Selle mehhanismi kasutamiseks Pythonis importige re moodul kõigepealt ja määratlege konkreetne muster, seejärel. Jällegi põhineb järgmine näide Nimekiri 1. Otsingu muster vastab sõnale "laht" ja algab kas väike- või suurtähega. Täpselt leiab järgnev Pythoni kood üles kõik stringid, milles otsingumuster esineb, olenemata sellest, millises stringi positsioonis – alguses, keskel või lõpus.

Nimekiri 4:


import re


listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]


pattern = re.compile("[Bb]ay")

for place in listOfPlaces:
    if pattern.search(place):
        print (f"{place} matches the search pattern")

Väljund on järgmine ja vastab kohtade loendis olevatele sõnadele "Bayswater", "Table Bay" ja "Bombay".

$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern

Mitme rea ja loendi võrdlused

Seni on meie võrdlused piirdunud vaid mõne sõnaga. Kasutades difflib moodul Python pakub ka võimalust võrrelda mitmerealisi stringe ja terveid sõnade loendeid. Väljundit saab konfigureerida vastavalt erinevatele diff-tööriistade vormingutele.

Järgmine näide (Nimekiri 5) võrdleb ridade kaupa kahte mitmerealist stringi ja kuvab nii kustutamisi kui ka lisamisi. Pärast initsialiseerimist Differ rea 12 objekti võrdlus tehakse kasutades compare() meetod real 15. Tulemus trükitakse standardväljundile:


import difflib
 


original = ["About the IIS", "", "IIS 8.5 has several improvements related", "to performance in large-scale scenarios, such", "as those used by commercial hosting providers and Microsoft's", "own cloud offerings."]


edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]


d = difflib.Differ()
 

diff = d.compare(original, edited)
 

print ('n'.join(diff))

Skripti käivitamine loob väljundi, nagu allpool näha. Kustutatud read on tähistatud tähisega - märgid, kusjuures täiendustega read algavad tähega a + märk. Lisaks algavad muudatustega read küsimärgiga. Muudatused on näidatud kasutades ^ märgid vastavas kohas. Ilma indikaatorita read on endiselt samad:

$ python comparing-strings-difflib.py
  About the IIS
  
- IIS 8.5 has several improvements related
?  ^^^^^^

+ It has several improvements related
?  ^

- to performance in large-scale scenarios, such
?                                        ^^^^^^

+ to performance in large-scale scenarios.
?                                        ^

- as those used by commercial hosting providers and Microsoft's
- own cloud offerings.

Järeldus

Sellest artiklist olete õppinud erinevaid viise, kuidas Pythonis stringe võrrelda. Loodame, et see ülevaade aitab teil arendaja elus tõhusalt programmeerida.

Tänusõnad

Autor soovib tänada Mandy Neumeyerit toetuse eest artikli ettevalmistamisel.

Ajatempel:

Veel alates Stackabus