U ovom uputstvu istražićemo kako se pišu Python programi za rešavanje uobičajenih pitanja koja se odnose na operacije sa stringovima.
Naučićete kako da utvrdite da li su dati Python stringovi palindromi, anagrami, i da li su napisani u formatu naslova.
Kratak pregled Python stringova
U Pythonu, stringovi su moćan ugrađeni tip podataka koji se koristi za čuvanje niza karaktera.
Indeksiranje stringova: Slično svim iterabilnim objektima u Pythonu, stringovi su indeksirani počevši od nule. To znači da za string dužine N, važeći indeksi su od 0, 1, 2, sve do N-1.
Python takođe podržava negativno indeksiranje, što omogućava pristup elementima stringa s kraja. Tako je -1 indeks poslednjeg karaktera, -2 predposlednjeg, i tako dalje.
Nepromenljivost stringova: Važno je napomenuti da su stringovi u Pythonu nepromenljivi, što znači da ih ne možete menjati direktno. Ipak, možete primeniti razne metode na stringove i dobiti kopije stringova sa željenim modifikacijama.
Nakon što smo razjasnili osnove Python stringova, pređimo na rešavanje nekih jednostavnih, ali zanimljivih problema.
Počnimo.
Provera da li je Python string palindrom
Zadatak: Dat je string u Pythonu. Treba da proverimo da li je taj string palindrom ili ne.
Ukoliko jeste, funkcija treba da vrati True; u suprotnom, vraća False.
Dakle, naš prvi zadatak je da proverimo da li je dati string palindrom.
Palindrom je niz karaktera koji se čita isto s leva na desno kao i s desna na levo. Neki primeri su: „trkački auto“, „rotor“, „nivo“, „madam“, „radar“, itd.
Evo koraka za rešavanje ovog problema:
- Kreirati obrnutu kopiju stringa i sačuvati je u zasebnoj promenljivoj.
- Uporediti vrednost originalnog stringa sa vrednošću obrnute kopije stringa.
- Ukoliko su jednake, string je palindrom. Vratiti True i prekinuti dalju obradu.
- Ukoliko originalna i obrnuta kopija nisu iste, string nije palindrom. Vratiti False.
Ključna operacija je dobijanje obrnute kopije stringa. Postoji više načina da se ovo postigne u Pythonu.
Mi ćemo se fokusirati na dva pristupa:
- Korišćenjem sečenja stringova (string slicing).
- Korišćenjem funkcije reversed() i metode join().
Kako obrnuti Python string pomoću sečenja
Sintaksa <neki_string>[start: stop: step]
vraća deo stringa <neki_string>
, počevši od indeksa start
do (ali ne uključujući) indeksa stop
, sa korakom veličine step
.
- Ako se
start
izostavi, sečenje počinje od početka stringa. - Ako se
stop
izostavi, sečenje se proteže do kraja stringa. - Negativne vrednosti
step
se mogu koristiti za sečenje počevši od kraja stringa.
Dakle, <neki_string>[::-1]
vraća obrnutu kopiju stringa.
Sledeći blok koda sadrži definiciju funkcije is_palindrome()
.
Ova funkcija prima string kao argument i vraća True ili False, u zavisnosti od toga da li je string palindrom ili ne.
Za dobijanje obrnute kopije stringa ovde je iskorišćeno sečenje stringa.
def is_palindrome(this_str):
rev_str = this_str[::-1]
if (this_str == rev_str):
return True
else:
return False
▶ Sada kada imamo definisanu funkciju, možemo je pozivati sa bilo kojim validnim stringom kao argumentom.
is_palindrome("racecar")
True
U gornjem primeru, „racecar“ jeste palindrom, pa funkcija is_palindrome()
vraća True, kako se i očekuje.
Pokušajte sada da pozovete funkciju sa nekim stringom koji nije palindrom, na primer „reka“.
is_palindrome("reka")
False
Kao što vidimo, funkcija vraća False, što je tačno. ✅
Kako obrnuti Python string pomoću reversed() i join()
U Pythonu, možete koristiti metodu join()
zajedno sa funkcijom reversed()
za obrtanje stringa.
- Funkcija
reversed()
vraća obrnuti iterator kroz karaktere u stringu. - Metoda
join()
se potom koristi za spajanje tih karaktera u obrnutom redosledu.
Koristeći ovu metodu, možemo ponovo napisati funkciju is_palindrome()
, kao što je prikazano u sledećem bloku koda.
def is_palindrome(this_str):
rev_str="".join(reversed(this_str))
if (this_str == rev_str):
return True
else:
return False
Funkciju is_palindrome()
možemo iskoristiti unutar list comprehension (razumevanje liste) kako bismo prikupili sve palindrome iz duže liste stringova.
str_list = ["rotor","plavo","nivo","12321","zmaj"]
palindromes = [string for string in str_list if is_palindrome(string)]
print(palindromes)
# Output
['rotor', 'nivo', '12321']
Evo kako gornji kod radi:
- Prolazi kroz
str_list
, i poziva funkcijuis_palindrome()
za svaki string. - Ako
is_palindrome()
vrati True, dodaje string u listu palindroma.
Kao što vidimo u izlaznom rezultatu, palindromi su lista svih palindromskih stringova iz str_list
.
Provera da li su dva Python stringa anagrami
Još jedno često pitanje koje se postavlja na intervjuima je da li su dva data stringa, str1
i str2
, anagrami.
Za dva stringa se kaže da su anagrami ako sadrže isti broj svakog karaktera. To znači da se jedan string može dobiti permutovanjem ili preuređivanjem karaktera drugog stringa.
Primeri anagrama su „stanje-ukus“, „spas-pas“, „lakat-telo“ i slično.
Kako proveriti anagrame koristeći Counter objekat u Pythonu
Jednostavan i intuitivan način je da se izbroji broj pojavljivanja svakog karaktera u oba stringa. Zatim se proverava da li su ti brojevi jednaki.
Ovo se još lakše može uraditi korišćenjem Counter
objekta iz modula collections
. Counter
objekat vraća Python rečnik, u kojem su karakteri ključevi, a brojači njihovih pojavljivanja su vrednosti.
Razmotrimo stringove „spas“ i „pas“ kao što je prikazano ispod:
str1 = "spas"
str2 = "pas"
Ovde su c1
i c2
Counter
objekti koji sadrže broj karaktera stringova str1
i str2
, respektivno.
from collections import Counter
c1 = Counter(str1)
c2 = Counter(str2)
print(c1)
print(c2)
c1 == c2
# Output
Counter({'s': 2, 'p': 1, 'a': 1})
Counter({'p': 1, 'a': 1, 's': 1})
False
c1 == c2
vraća False jer str1
i str2
nisu anagrami (broj pojavljivanja ‘s’ nije jednak).
Koristeći ovu logiku, sada možemo definisati funkciju are_anagrams()
koja prima dva parametra, word1
i word2
. Unutar tela funkcije, proveravamo da li je Counter(word1) == Counter(word2)
.
def are_anagrams(word1, word2):
if Counter(word1) == Counter(word2):
return True
else:
return False
▶ Da bismo ovo testirali, pozvaćemo are_anagrams()
sa str1
i str2
kao argumentima. Pošto str1
i str2
nisu anagrami, funkcija vraća False, što je tačno.
are_anagrams(str1, str2)
False
Kako proveriti anagrame koristeći sortirane kopije stringova
Postoji još jedan način da se ovo uradi.
Ako su dva stringa anagrami, onda su njihove sortirane kopije jednake.
Stoga, možemo prepisati funkciju are_anagrams()
da proveri da li je sortirana verzija str1
ista kao sortirana kopija str2
. Ako su jednake, onda su dva stringa anagrami; u suprotnom, nisu.
Koristeći gore navedenu metodu, možemo prepisati funkciju are_anagrams()
na sledeći način.
def are_anagrams(word1, word2):
if sorted(word1) == sorted(word2):
return True
else:
return False
Napravimo nekoliko poziva funkcije:
- Stringovi „telo“ i „lakat“ su anagrami, i funkcija
are_anagrams()
vraća True. - A „stanje“ i „degustacija“ nisu anagrami, pa funkcija vraća False.
are_anagrams("telo","lakat")
True
are_anagrams("stanje","degustacija")
False
Provera da li je Python string u formatu naslova
Ovo je naše poslednje pitanje u ovom uputstvu.
Zadatak: Dat je string koji predstavlja ime osobe—s imenom i prezimenom.
Potrebno je proveriti da li je početno slovo i imena i prezimena veliko.
Ovakav način pisanja, gde je početno slovo svake reči veliko, zove se format naslova.
Treba da se proveri da li je ime u formatu naslova:
1. Ako jeste, ispišite poruku da je formatiranje već u formatu naslova.
2. U suprotnom, vratite kopiju stringa formatiranu u formatu naslova.
- Python ima ugrađenu metodu
istitle()
koja proverava da li je string u formatu naslova.
<string>.istitle()
vraća True ako je string <string>
formatiran u formatu naslova, u suprotnom vraća False.
- Python string metoda
title()
vraća kopiju stringa formatiranu u formatu naslova.
Dakle, sada možemo iskoristiti ove dve metode da rešimo problem.
Definišemo funkciju check_titlecase()
koja prima ime kao argument.
- Pozivamo metodu
istitle()
na ulaznom stringu da proverimo da li je formatiran u formatu naslova. - Ako je rezultat True, ispisujemo poruku da je string već u formatu naslova.
- U suprotnom, pozivamo metodu
title()
i vraćamo kopiju stringa u formatu naslova.
Sledeći blok koda prikazuje definiciju funkcije check_titlecase()
.
def check_titlecase(name):
if name.istitle():
print(f"'{name}' je već formatiran u formatu naslova.")
else:
return name.title()
Sada pozovimo metodu check_titlecase()
sa nekim argumentom.
check_titlecase("jana jankovic")
# Output
Jana Jankovic
U gornjem izlazu vidimo da je string „Jana Jankovic“ sada formatiran u formatu naslova.
▶ Uzmimo još jedan primer.
check_titlecase("agatha kristi")
# Output
Agatha Kristi
Sada pozovimo funkciju sa stringom koji je već u formatu naslova.
check_titlecase("Ana Ivanovic")
# Output
'Ana Ivanovic' je već formatiran u formatu naslova.
Dobijamo obaveštenje da je string formatiran u formatu naslova, što znači da funkcija radi kako se očekuje.
Zaključak 👩🏫
Da sumiramo probleme o kojima smo do sada razgovarali:
- Da biste proverili da li je string palindrom, treba da proverite da li su string i njegova obrnuta verzija jednaki. Za obrtanje stringova možete koristiti sečenje stringova ili ugrađene metode.
- Da biste proverili da li su dva stringa anagrami, treba da proverite da li su njihove sortirane kopije jednake. Za sortiranje stringa, koristite ugrađenu funkciju
sorted()
. - Da biste proverili da li je ime napisano u formatu naslova, koristite metodu
istitle()
za proveru, a metodutitle()
za dobijanje kopije stringa formatirane u formatu naslova.
Nadam se da ste uživali u ovom uputstvu o Python stringovima. Kao sledeći korak, možete istražiti kako se koriste list comprehensions u Pythonu ili naučiti o operatoru nejednakosti u Pythonu.
Srećno u učenju i kodiranju! 🎉