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 funkcjisorted()
. - 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ściTrue
lubFalse
.- Domyślnie
reverse
jest ustawiony naFalse
, co oznacza, że lista będzie sortowana w porządku rosnącym. Ustawieniereverse
naTrue
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
ikey
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