Porzadek leksykograficzny, porownywanie znak po znaku, operacje na lancuchach
ð Podstawa programowa: I.2bLancuch 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
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'
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:
# 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)
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)
tekst.lower().
Uszereguj ponizsze slowa w porzadku leksykograficznym (jak w slowniku): "programowanie", "python", "program", "Pascal", "print". Nastepnie zweryfikuj wynik w Pythonie.
# 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']
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".
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
Napisz program, ktory wczytuje tekst od uzytkownika i wyswietla: a) liczbe wielkich liter, b) liczbe malych liter, c) liczbe cyfr, d) liczbe pozostalych znakow.
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}")
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.
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)