Jak sortować listy w Pythonie

W tym artykule zgłębisz tajniki sortowania list w języku Python.

Python oferuje dwie główne metody porządkowania elementów w listach. Pierwszą z nich jest metoda sort(), która modyfikuje listę bezpośrednio. Drugą opcją jest funkcja wbudowana sorted(), która tworzy nową, posortowaną kopię listy, pozostawiając oryginał bez zmian.

W tym poradniku omówimy:

  • Sposób użycia i składnię metody sort() oraz funkcji sorted().
  • Przykłady kodu demonstrujące sortowanie list w porządku rosnącym i malejącym.
  • Możliwość dostosowania procesu sortowania za pomocą parametru key.
  • Kluczowe różnice pomiędzy metodą sort() a funkcją sorted().

Zacznijmy naszą przygodę z sortowaniem! 🚀

Sposób użycia metody sort() w Pythonie

Metoda sort() jest wywoływana bezpośrednio na obiekcie listy. Jej działanie polega na modyfikacji oryginalnej listy poprzez zmianę kolejności jej elementów.

Ogólna składnia metody sort() w Pythonie przedstawia się następująco:

<lista>.sort(reverse = True | False, key = <funkcja>)

Rozłóżmy teraz tę strukturę na czynniki pierwsze:

  • <lista> reprezentuje dowolną, poprawną listę w Pythonie.
  • reverse jest parametrem opcjonalnym. Może przyjmować wartości True lub False.
  • Domyślnie reverse jest ustawiony na False, co oznacza, że lista będzie sortowana w porządku rosnącym. Ustawienie reverse na True spowoduje posortowanie listy w porządku malejącym.
  • key to również opcjonalny parametr, który powinien wskazywać na funkcję <funkcja>.
  • <funkcja> może być zarówno funkcją wbudowaną, jak i funkcją zdefiniowaną przez użytkownika, która decyduje o kryterium sortowania.

Przejdźmy teraz do praktycznych przykładów, aby lepiej zrozumieć, jak to działa.

Sortowanie listy w porządku rosnącym

Rozważmy listę liczb. Aby je uporządkować w kolejności rosnącej, wywołujemy metodę sort() bezpośrednio na tej liście.

▶ Przeanalizuj poniższy fragment kodu:

nums = [25, 13, 6, 17, 9]
nums.sort()
print(nums)

# Wynik: [6, 9, 13, 17, 25]

Jak widzisz, elementy listy nums zostały posortowane od najmniejszej do największej wartości. Co ważne, oryginalna lista została zmodyfikowana, a nie powstała nowa. Takie działanie nazywamy sortowaniem „w miejscu”.

Sortowanie listy w porządku malejącym

Aby posortować listę w odwrotnej kolejności, ustaw parametr reverse na True, jak widać poniżej:

nums = [25, 13, 6, 17, 9]
nums.sort(reverse = True)
print(nums)

# Wynik: [25, 17, 13, 9, 6]

Teraz lista jest uporządkowana od największego do najmniejszego elementu.

Dostosowanie sortowania za pomocą parametru key

Parametr key otwiera drzwi do bardziej zaawansowanego sortowania. Umożliwia on zdefiniowanie niestandardowego kryterium, według którego elementy mają być porządkowane.

Załóżmy, że mamy funkcję mod5(), która zwraca resztę z dzielenia liczby przez 5.

def mod5(x):
  return x % 5

Teraz użyjemy tej funkcji jako klucza w procesie sortowania.

Przeanalizujmy poniższy kod:

nums = [25, 13, 6, 17, 9]
nums.sort(key = mod5)
print(nums)

# Wynik: [25, 6, 17, 13, 9]

Spójrz na wynik uważnie.

Zauważ, że elementy zostały posortowane nie według ich wartości, ale według wartości zwracanej przez funkcję mod5.

  • Elementy o najmniejszej reszcie z dzielenia przez 5 pojawiają się na początku listy.
  • Elementy o największej reszcie z dzielenia przez 5 pojawiają się na końcu.

Aby to potwierdzić, przeanalizujmy reszty z dzielenia dla każdego elementu:

nums = [25, 13, 6, 17, 9]

for num in nums:
  print(f"{num} daje resztę {num%5} przy dzieleniu przez 5")

# Wynik
25 daje resztę 0 przy dzieleniu przez 5
13 daje resztę 3 przy dzieleniu przez 5
6 daje resztę 1 przy dzieleniu przez 5
17 daje resztę 2 przy dzieleniu przez 5
9 daje resztę 4 przy dzieleniu przez 5

Liczba 25 jest podzielna przez 5 bez reszty, dlatego znajduje się na pierwszym miejscu. Liczba 6 daje resztę 1, więc jest druga, i tak dalej. Liczba 9, dająca resztę 4, jest ostatnia.

Zamiast tworzyć oddzielną funkcję, możemy również użyć wyrażeń lambda, czyli krótkich, anonimowych funkcji. Wyrażenie lambda ma postać lambda argumenty: wyrażenie i zwraca wynik tego wyrażenia.

Przeróbmy powyższy przykład z użyciem lambdy:

nums = [25, 13, 6, 17, 9]
nums.sort(key = lambda x: x%5)
print(nums)

# Wynik: [25, 6, 17, 13, 9]

Do tej pory pracowaliśmy z listami liczb. Teraz zobaczmy, jak sortować listy ciągów tekstowych.

Sortowanie listy ciągów alfabetycznie

Sortowanie list ciągów odbywa się domyślnie w porządku alfabetycznym. Załóżmy, że mamy listę uczniów Hogwartu:

students = ["Harry", "Ron", "Hermione", "Draco", "Cedric"]

Uporządkujmy ją alfabetycznie:

students.sort()
print(students)

# Wynik
['Cedric', 'Draco', 'Harry', 'Hermione', 'Ron']

Sortowanie listy ciągów w odwrotnej kolejności alfabetycznej

Aby posortować listę ciągów w odwrotnej kolejności alfabetycznej, należy ustawić reverse = True:

students.sort(reverse = True)
print(students)

# Wynik
['Ron', 'Hermione', 'Harry', 'Draco', 'Cedric']

Dostosowanie sortowania list zagnieżdżonych za pomocą parametru key

W tej sekcji użyjemy parametru key do sortowania listy bardziej złożonych obiektów.

Załóżmy, że mamy listę domów Hogwartu, gdzie każdy dom jest reprezentowany jako słownik z nazwą ucznia i nazwą domu:

houses = [
            {1:"Draco", "house":"Slytherin"},
            {2:"Harry", "house":"Gryffindor"},
            {3:"Cedric", "house":"Hufflepuff"}
         ]

Chcemy posortować tę listę alfabetycznie według nazw domów.

Użyjemy funkcji returnHouse(), która zwraca nazwę domu dla danego ucznia:

def returnHouse(student):
  return student['house']

Teraz możemy posortować listę houses, używając tej funkcji jako klucza:

houses.sort(key=returnHouse)

Wynik sortowania odzwierciedla alfabetyczną kolejność domów:

print(houses)

# Wynik
[{2: 'Harry', 'house': 'Gryffindor'},
{3: 'Cedric', 'house': 'Hufflepuff'},
{1: 'Draco', 'house': 'Slytherin'}]

Możemy osiągnąć ten sam efekt, wykorzystując wyrażenie lambda:

houses.sort(key=lambda student:student["house"])
print(houses)

# Wynik
[{2: 'Harry', 'house': 'Gryffindor'},
{3: 'Cedric', 'house': 'Hufflepuff'},
{1: 'Draco', 'house': 'Slytherin'}]

Jak już wiemy, metoda sort() modyfikuje oryginalną listę. Co zrobić, gdy chcemy zachować oryginalną listę, a jedynie otrzymać posortowaną kopię?

W Pythonie do tego celu służy funkcja sorted().

Sposób użycia funkcji sorted() w Pythonie

Funkcja sorted() przyjmuje jako argument listę lub dowolny element iterowalny. Zwraca ona nową, posortowaną listę, pozostawiając oryginalną kolekcję bez zmian.

Ogólna składnia funkcji sorted() jest następująca:

<posortowana_kopia> = sorted(<lista>, reverse = True | False, key = <funkcja>)

Składnia jest bardzo zbliżona do metody sort():

  • <lista> jest wymaganym argumentem i reprezentuje dowolną listę w Pythonie.
  • reverse i key są parametrami opcjonalnymi.

Warto zauważyć, że w przeciwieństwie do metody sort(), która działa tylko na listach, funkcja sorted() może być używana z dowolnymi elementami iterowalnymi, takimi jak listy, ciągi znaków czy słowniki.

Sortowanie listy za pomocą funkcji sorted()

#1. Załóżmy, że mamy listę liczb nums:

nums = [25, 13, 6, 17, 9]
sorted_nums1 = sorted(nums)
print(sorted_nums1)

# Wynik: [6, 9, 13, 17, 25]

Jak widać, sorted() zwróciła posortowaną listę w porządku rosnącym.

Co ważne, oryginalna lista nums nie uległa zmianie:

print(nums)
 # Wynik: [25, 13, 6, 17, 9]

#2. Ustawmy teraz parametr reverse na True, aby posortować listę w porządku malejącym:

sorted_nums2 = sorted(nums, reverse = True)
print(sorted_nums2)

# Wynik: [25, 17, 13, 9, 6]

#3. Spróbujmy teraz z listą ciągów tekstowych:

fruits = ['pears', 'strawberry', 'apple', 'pineapple', 'blueberry']
sorted_fr1 = sorted(fruits)
print(sorted_fr1)

# Wynik:
['apple', 'blueberry', 'pears', 'pineapple', 'strawberry']

#4. Na koniec użyjmy parametru key, ustawiając go na len, co spowoduje posortowanie listy według długości poszczególnych ciągów:

Funkcja wbudowana len() zwraca długość elementów iterowalnych.

fruits = ['pear', 'strawberry', 'apple', 'pineapple', 'blueberry']
sorted_fr2 = sorted(fruits, key=len)
print(sorted_fr2)

# Wynik:
['pear', 'apple', 'pineapple', 'blueberry', 'strawberry']

W efekcie lista została posortowana od najkrótszego do najdłuższego ciągu.

Różnice między metodą sort() a funkcją sorted()

Podsumujmy kluczowe różnice między sort() a sorted():

Python .sort() Python sorted()
Sortuje listę „w miejscu” – modyfikuje oryginał Zwraca nową, posortowaną listę
Działa tylko z listami Działa z dowolnymi elementami iterowalnymi
Zwraca None Zwraca posortowaną kopię elementu iterowalnego

Podsumowanie 👩‍🏫

Mam nadzieję, że ten poradnik pomógł Ci w zrozumieniu mechanizmów sortowania list w Pythonie.

Pamiętajmy, że:

  • Metoda list.sort(reverse = True | False, key = <funkcja>) modyfikuje listę bezpośrednio.
  • Funkcja sorted(list, reverse = True | False, key = <funkcja>) zwraca posortowaną kopię, zachowując oryginał.

Teraz, gdy sortowanie list nie ma przed Tobą tajemnic, zachęcam Cię do zgłębienia innych aspektów Pythona, takich jak operacje na plikach czy praca z JSON.

Możesz samodzielnie testować przedstawione przykłady w kompilatorze online newsblog.pl.


newsblog.pl