Liceum Klasa I 45 minut PP: I.2b | s. 342

Lekcja 16: Algorytmy na tekstach - porownywanie tekstow

Porzadek leksykograficzny, porownywanie znak po znaku, operacje na lancuchach

📋 Podstawa programowa: I.2b
ASCIIalgorytmyporownywanie tekstowstringznaki
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Lancuchy znakow (stringi) w Pythonie

Lancuch znakow (string) to sekwencja znakow. W Pythonie stringi sa typem str i mozna je tworzyc za pomoca cudzyslowow pojedynczych lub podwojnych. Kazdy znak w stringu ma swoj indeks (numer pozycji), liczony od 0.

tekst = "Informatyka"
print(tekst[0])    # 'I' - pierwszy znak
print(tekst[4])    # 'r' - piaty znak (indeks 4)
print(tekst[-1])   # 'a' - ostatni znak
print(len(tekst))   # 11 - dlugosc tekstu

# Iterowanie po znakach
for znak in tekst:
    print(znak, end=" ")
# I n f o r m a t y k a

Kodowanie znakow - ASCII i Unicode

Kazdy znak w komputerze jest reprezentowany jako liczba. Standard ASCII przypisuje kody od 0 do 127 najczesciej uzywanym znakom. W Pythonie mozemy uzyc funkcji ord() (znak na kod) i chr() (kod na znak).

# Kody ASCII
print(ord('A'))   # 65
print(ord('Z'))   # 90
print(ord('a'))   # 97
print(ord('z'))   # 122
print(ord('0'))   # 48

print(chr(65))    # 'A'
print(chr(97))    # 'a'
Wazne kody ASCII:
  • 'A' do 'Z': kody 65-90 (wielkie litery)
  • 'a' do 'z': kody 97-122 (male litery)
  • '0' do '9': kody 48-57 (cyfry)
  • Roznica miedzy wielka a mala litera: 32

Porownywanie tekstow - porzadek leksykograficzny

Porzadek leksykograficzny to sposob uporzadkowania tekstow analogiczny do kolejnosci w slowniku. Porownujemy teksty znak po znaku, od lewej do prawej, uzywajac kodow ASCII poszczegolnych znakow.

Zasady porownywania:

  1. Porownujemy pierwszy znak obu tekstow. Jesli sa rozne, mniejszy jest ten o mniejszym kodzie ASCII.
  2. Jesli pierwsze znaki sa takie same, porownujemy drugie, potem trzecie itd.
  3. Jesli jeden tekst jest przedrostkiem drugiego (np. "dom" i "domek"), krotszy jest mniejszy.
# Porownywanie tekstow w Pythonie
print("abc" < "abd")      # True  (c < d)
print("abc" < "abcd")     # True  (krotszy = mniejszy)
print("Abc" < "abc")      # True  (A=65 < a=97)
print("dom" < "domek")    # True  (przedrostek)
print("zebra" > "antylopa")  # True (z > a)

Algorytm porownywania znak po znaku

Napiszmy wlasna implementacje porownywania leksykograficznego, aby zrozumiec jak to dziala "od srodka":

def porownaj(tekst1, tekst2):
    """Porownuje dwa teksty leksykograficznie.
    Zwraca: -1 jesli tekst1 < tekst2,
             0 jesli tekst1 == tekst2,
             1 jesli tekst1 > tekst2"""
    dlugosc = min(len(tekst1), len(tekst2))

    for i in range(dlugosc):
        if ord(tekst1[i]) < ord(tekst2[i]):
            return -1
        elif ord(tekst1[i]) > ord(tekst2[i]):
            return 1

    # Wszystkie wspolne znaki sa takie same
    if len(tekst1) < len(tekst2):
        return -1
    elif len(tekst1) > len(tekst2):
        return 1
    else:
        return 0

# Testy
print(porownaj("abc", "abd"))    # -1 (abc < abd)
print(porownaj("abc", "abc"))    # 0  (rowne)
print(porownaj("abd", "abc"))    # 1  (abd > abc)
print(porownaj("dom", "domek"))  # -1 (krotszy)
Uwaga! Wielkie litery maja mniejsze kody ASCII niz male litery. Dlatego "Zebra" < "antylopa" w porzadku leksykograficznym! Aby porownywac bez rozrozniana wielkosci liter, nalezy najpierw zamienic oba teksty na male litery: tekst.lower().
✏️

Zadania

Latwe

Zadanie 1: Porownywanie reczne

Uszereguj ponizsze slowa w porzadku leksykograficznym (jak w slowniku): "programowanie", "python", "program", "Pascal", "print". Nastepnie zweryfikuj wynik w Pythonie.

Pokaz rozwiazanie
# Wielkie litery maja mniejsze kody niz male!
# P (80) < p (112), wiec "Pascal" i "print" sa przed malymi

slowa = ["programowanie", "python", "program", "Pascal", "print"]
posortowane = sorted(slowa)
print(posortowane)
# ['Pascal', 'print', 'program', 'programowanie', 'python']

# Bez rozrozniana wielkosci liter:
posortowane2 = sorted(slowa, key=str.lower)
print(posortowane2)
# ['Pascal', 'print', 'program', 'programowanie', 'python']
Srednie

Zadanie 2: Czy palindrom?

Napisz funkcje czy_palindrom(tekst), ktora sprawdza, czy podany tekst jest palindromem (czytany od przodu i od tylu jest taki sam). Ignoruj wielkosci liter. Przetestuj dla: "kajak", "Anna", "Python".

Pokaz rozwiazanie
def czy_palindrom(tekst):
    tekst = tekst.lower()
    return tekst == tekst[::-1]

# Testy
print(czy_palindrom("kajak"))   # True
print(czy_palindrom("Anna"))    # True
print(czy_palindrom("Python"))  # False
print(czy_palindrom("abba"))    # True

# Wersja bez uzycia slicingu - z petla:
def czy_palindrom_v2(tekst):
    tekst = tekst.lower()
    n = len(tekst)
    for i in range(n // 2):
        if tekst[i] != tekst[n - 1 - i]:
            return False
    return True
Srednie

Zadanie 3: Liczenie znakow

Napisz program, ktory wczytuje tekst od uzytkownika i wyswietla: a) liczbe wielkich liter, b) liczbe malych liter, c) liczbe cyfr, d) liczbe pozostalych znakow.

Pokaz rozwiazanie
tekst = input("Podaj tekst: ")

wielkie = 0
male = 0
cyfry = 0
inne = 0

for znak in tekst:
    if znak.isupper():
        wielkie += 1
    elif znak.islower():
        male += 1
    elif znak.isdigit():
        cyfry += 1
    else:
        inne += 1

print(f"Wielkie litery: {wielkie}")
print(f"Male litery: {male}")
print(f"Cyfry: {cyfry}")
print(f"Inne znaki: {inne}")
Trudne

Zadanie 4: Sortowanie slow

Napisz program, ktory wczytuje zdanie od uzytkownika, dzieli je na slowa i wyswietla te slowa posortowane leksykograficznie (bez rozrozniana wielkosci liter). Uzyj wlasnej funkcji porownujacej.

Pokaz rozwiazanie
zdanie = input("Podaj zdanie: ")
slowa = zdanie.split()

# Sortowanie babelkowe z wlasnym porownaniem
n = len(slowa)
for i in range(n - 1):
    for j in range(n - 1 - i):
        if slowa[j].lower() > slowa[j+1].lower():
            slowa[j], slowa[j+1] = slowa[j+1], slowa[j]

print("Posortowane slowa:")
for slowo in slowa:
    print(slowo)
🎥

Materialy wideo

Algorithms on texts - text comparison
Dziwne... u mnie działa - (ScratchSPWZ)
Algorithms on texts - searching for a pattern in text
Dziwne... u mnie działa - (ScratchSPWZ)
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 15: Powtorzenie Lekcja 17: Wyszukiwanie wzorca →