Wyobraź sobie, że masz kilkanaście liczb zapisanych w przypadkowej kolejności. Chcesz znaleźć najmniejszą liczbę, największą wartość albo przygotować ranking wyników. Możesz sprawdzać każdą liczbę osobno, ale znacznie wygodniej będzie najpierw je uporządkować. Właśnie temu służy sortowanie danych.
Sortowanie to proces porządkowania danych według określonej zasady, nazywanej kryterium sortowania. Możemy sortować liczby, teksty, daty, ceny produktów, wyniki zawodów i wiele innych informacji.
Najczęściej spotykamy dwa sposoby sortowania liczb:
Przykład: mamy liczby 8, 3, 12, 1, 6.
Ważne: sortowanie nie zmienia wartości liczb. Zmienia jedynie ich kolejność.
Sortowanie jest jedną z najczęściej wykorzystywanych operacji w informatyce, ale spotykamy je również poza komputerami.
Każde sortowanie wymaga ustalenia kryterium. Przykładowo produkty można uporządkować według ceny, nazwy lub daty dodania. Te same dane mogą więc występować w różnych kolejnościach.
Python posiada gotowe narzędzia do sortowania. Najprostszym z nich jest metoda sort(), która porządkuje elementy listy.
Tworzymy listę zawierającą pięć liczb, a następnie sortujemy ją od najmniejszej do największej.
liczby = [8, 3, 12, 1, 6]
liczby.sort()
print(liczby)
Wynik działania programu: [1, 3, 6, 8, 12].
Metoda sort() zmienia kolejność elementów bezpośrednio w istniejącej liście.
Jeżeli chcemy uporządkować liczby od największej do najmniejszej, wykorzystujemy parametr reverse=True.
punkty = [45, 82, 67, 91, 38]
punkty.sort(reverse=True)
print(punkty)
Wynik: [91, 82, 67, 45, 38].
Takie sortowanie przydaje się podczas przygotowywania rankingów, w których najwyższy wynik powinien znajdować się na początku listy.
Czasami potrzebujemy zachować pierwotną kolejność danych. Przykładowo wyniki uczniów mogą być zapisane według numerów w dzienniku, a my chcemy dodatkowo utworzyć ranking.
Możemy wtedy wykorzystać funkcję sorted().
wyniki = [70, 45, 90, 60, 80]
ranking = sorted(wyniki, reverse=True)
print(wyniki)
print(ranking)
Oryginalna lista pozostanie bez zmian: [70, 45, 90, 60, 80].
Nowa lista będzie zawierała ranking: [90, 80, 70, 60, 45].
Zapamiętaj: metoda sort() zmienia istniejącą listę, natomiast funkcja sorted() zwraca nową, uporządkowaną listę.
W poprzednich przykładach liczby były zapisane bezpośrednio w programie. Możemy jednak przygotować program, w którym użytkownik sam podaje wartości.
Program powinien:
Przykładowy program:
liczby = []
for i in range(5):
liczba = int(input("Podaj liczbę: "))
liczby.append(liczba)
liczby.sort()
print(liczby)
Instrukcja int() zamienia wprowadzony tekst na liczbę całkowitą. Metoda append() dodaje kolejny element na koniec listy.
Dotychczas korzystaliśmy z gotowych funkcji Pythona. Warto jednak zrozumieć, w jaki sposób można samodzielnie uporządkować liczby.
Jedną z najprostszych metod jest sortowanie bąbelkowe (ang. bubble sort).
Algorytm polega na wielokrotnym porównywaniu dwóch sąsiednich elementów. Jeżeli znajdują się w niewłaściwej kolejności, zamieniamy je miejscami.
Mamy liczby: 5, 2, 8, 1.
Po każdym pełnym przejściu największa liczba z jeszcze nieuporządkowanej części listy trafia na właściwe miejsce.
Sortowanie bąbelkowe jest łatwe do zrozumienia, ale przy dużych zbiorach danych zwykle działa znacznie wolniej niż algorytmy wykorzystywane przez gotowane funkcje sortujące Pythona.
W praktyce dane nie zawsze znajdują się bezpośrednio w programie. Bardzo często są przechowywane w plikach tekstowych, bazach danych lub innych źródłach.
W edytorze Python na stronie ai.robotech.edu.pl/python.html dostępny jest wirtualny plik dane.txt. Możemy wykorzystać go do ćwiczeń z odczytywania i sortowania liczb.
W pliku zapisano następujące liczby, każdą w osobnym wierszu:
124
456
789
224
556
12
991
Naszym zadaniem jest odczytanie liczb z pliku, uporządkowanie ich rosnąco i wyświetlenie wyniku.
Przy standardowej obsłudze plików tekstowych w Pythonie możemy wykorzystać instrukcję open().
liczby = []
with open("dane.txt", "r") as plik:
for wiersz in plik:
liczby.append(int(wiersz.strip()))
print(liczby)
Program otwiera plik do odczytu, pobiera kolejne wiersze, usuwa zbędne białe znaki i zamienia zapis tekstowy na liczbę całkowitą.
Instrukcja strip() usuwa białe znaki z początku i końca tekstu, w tym znak końca wiersza.
Rozbudowujemy poprzedni program o sortowanie rosnące.
liczby = []
with open("dane.txt", "r") as plik:
for wiersz in plik:
liczby.append(int(wiersz.strip()))
liczby.sort()
print(liczby)
Oczekiwany wynik: [12, 124, 224, 456, 556, 789, 991].
W ten sposób połączyliśmy trzy operacje: odczyt danych, przetwarzanie danych oraz wyświetlenie wyniku.
W kolejnym kroku możemy zapisać uporządkowane liczby do nowego pliku posortowane.txt, pozostawiając oryginalny plik dane.txt bez zmian.
liczby = []
with open("dane.txt", "r") as plik:
for wiersz in plik:
liczby.append(int(wiersz.strip()))
liczby.sort()
with open("posortowane.txt", "w") as plik:
for liczba in liczby:
plik.write(str(liczba) + "
")
print("Zapisano posortowane liczby.")
Warto zwrócić uwagę na trzy elementy:
"r" oznacza otwarcie pliku do odczytu."w" oznacza otwarcie pliku do zapisu. Jeżeli plik już istnieje, jego dotychczasowa zawartość zostanie zastąpiona.str(liczba) zamienia liczbę na tekst, który można zapisać do pliku.Znak oznacza przejście do nowego wiersza.
Plik tekstowy przechowuje znaki. Odczytując z niego liczbę, początkowo otrzymujemy tekst, a nie wartość liczbową.
To ważne, ponieważ Python inaczej sortuje liczby, a inaczej napisy.
Przykładowe dane: 3, 20, 100, 8.
Podczas sortowania tekstu porównywane są kolejne znaki, dlatego napis „100” znajduje się przed napisem „20”.
Wniosek: jeżeli chcemy sortować liczby odczytane z pliku tekstowego, należy wcześniej zamienić je na typ liczbowy, np. za pomocą int() lub float().
Wykonaj poniższe ćwiczenia w edytorze Python. Zacznij od najłatwiejszych i stopniowo przechodź do trudniejszych.
dane.txt i wyświetl je w kolejności rosnącej.dane.txt i zapisz wynik do nowego pliku posortowane.txt.sort() i sorted().sort() sortuje istniejącą listę i zmienia kolejność jej elementów.sorted() tworzy nową posortowaną listę.reverse=True umożliwia sortowanie malejące.Najważniejszy wniosek: sortowanie jest jednym z podstawowych sposobów przetwarzania danych. Ułatwia wyszukiwanie informacji, przygotowywanie rankingów, analizowanie wyników i organizowanie dużych zbiorów danych. W Pythonie możemy korzystać zarówno z gotowych funkcji sortujących, jak i samodzielnie tworzyć algorytmy porządkowania danych.