Zrozumienie funkcji posortowanej w Pythonie: prosty przewodnik

Jedną z największych zalet używania Pythona jest jego prostota. Praca z nim jest łatwa, ponieważ jego standardowa biblioteka zawiera wiele pomocnych funkcji. Jedną z takich funkcji jest funkcja sortowana.

Ta funkcja służy do sortowania iteracji według pewnej kolejności. Bez takiej funkcji trzeba napisać kod implementujący algorytm sortowania, taki jak Bubble Sort lub Insertion Sort. Często jest to trudne, ale Python zapewnia prostszy sposób, który omówimy w tym artykule.

Wprowadzenie do funkcji sortowanej

Funkcja sorted to funkcja, która sortuje elementy iterowalne w Pythonie. Iterable to dowolna wartość, którą można zapętlić. Przykładami elementów iterowalnych są ciągi znaków, listy, krotki i zbiory. Te elementy iteracyjne są często nieuporządkowane, a sortowanie ustawia ich wartości w określonej kolejności. Porządkowanie wartości jest pomocne, ponieważ:

  • Wyszukiwanie według wartości jest szybsze i bardziej wydajne przy użyciu algorytmów, takich jak wyszukiwanie binarne. Jednak wyszukiwanie binarne wymaga najpierw posortowania wartości.
  • Aby wyświetlić wartości. Czasami użytkownicy chcieliby przeglądać informacje posortowane, na przykład od najniższej ceny lub od najnowszego posta. Wymagałoby to zaimplementowania pewnego sposobu sortowania listy wartości.
  • Podczas przeprowadzania analizy statystycznej, na przykład w celu znalezienia najczęściej występującej wartości w zbiorze. Łatwiej to zrobić, gdy wartości są posortowane w kolejności.

Posortowany przewodnik użycia funkcji

Jak wspomniano wcześniej, sortowana funkcja działa ze wszystkimi iteracjami. Z kolei zwraca listę, która została posortowana. Należy o tym pamiętać — chociaż dane wejściowe mogą być dowolne, iterowalne, wartość zwracana zawsze musi być listą.

Składnia funkcji posortowanej

Sygnatura funkcji posortowanej jest następująca:

sorted(iterable, key=None, reverse=False)

Jak widać, jedynym wymaganym argumentem jest argument iterowalny, który zostanie posortowany.

Kluczem jest następujący argument. Klucz to funkcja, która zostanie użyta do przekształcenia każdego elementu w iterowalności w celu uzyskania wartości, która będzie używana do sortowania. Będzie to przydatne do sortowania listy słowników, jak zobaczysz później. Wartość domyślna to none, więc nie zastosuje żadnej funkcji, chyba że zostanie określona.

Ostatni argument jest argumentem odwrotnym. W przypadku ustawienia wartości true elementy będą sortowane w odwrotnej kolejności.

W następnej sekcji użyję przykładów, aby zademonstrować, jak używać tej funkcji.

Przykłady użycia funkcji posortowanych

Lista numerów

Najprostszym przypadkiem sortowania wartości jest sortowanie listy liczb. Rozważ następujący przykład kodu:

# A list of unsorted values
numbers = [8, 4, 3, 9, 2, 0, 3]

# Sorting the numbers
sorted_numbers = sorted(numbers)

# Outputting the sorted values
print(sorted_numbers)

Wyjście byłoby:

[0, 2, 3, 3, 4, 8, 9]

Jak widać, wartości zostały posortowane rosnąco. Ustawisz reverse na true, jeśli chcesz posortować je w kolejności malejącej. Dlatego wiersz 4 w poprzednim przykładzie kodu wyglądałby tak:

sorted_numbers = sorted(numbers, reverse=True)

Wynikiem działania zmodyfikowanego programu byłoby:

[9, 8, 4, 3, 3, 2, 0]

Lista ciągów

Sortowana funkcja obsługuje więcej niż tylko liczby. Możesz także sortować ciągi znaków. Aby posortować ciągi na liście, porównywane są pierwsze znaki ciągów. Porównania są wykonywane na wartościach ASCII znaków. Na przykład „hello” pojawi się przed słowem „world”, ponieważ wartość ASCII „h” wynosi 104, mniej niż wartość ASCII „w”, czyli 119.

Jeśli jeden lub więcej ciągów znaków ma ten sam pierwszy znak, ich drugi i kolejne znaki są porównywane, aż do ustalenia kolejności. Oto przykład kodu, w którym sortujemy nazwiska osób.

# Creating a list of names
members_list = ['bob', 'dave', 'charlie', 'alice']

# Sorting the names
sorted_members_list = sorted(members_list)

# Printing the names
print(sorted_members_list)

Spowoduje to wygenerowanie następującego wyniku:

['alice', 'bob', 'charlie', 'dave']

Ponieważ używane są wartości ASCII, kolejność łańcuchów zależy od tego, który znak występuje jako pierwszy w tabeli ASCII. Na przykład wielka litera będzie występować przed małą literą, ponieważ wielkie litery występują przed małymi literami w ASCII. Oto pełna tabela ASCII w celach informacyjnych:

Źródło: commons.wikimedia.org

Inne elementy iterowalne — ciągi znaków, krotki i zbiory

Jak wspomniałem, funkcja sorted działa z różnymi rodzajami iteracji. Te same zasady dotyczą sposobu sortowania wartości w iteracjach. Oto przykład:

# Printing a sorted string
print(sorted("dijkstra"))

# Printing a sorted tuple of values
print(sorted((3, 4, 2, 1, 5, 0)))

# Printing a sorted set of values
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

Wynikiem tego będzie:

['a', 'd', 'i', 'j', 'k', 'r', 's', 't']
[0, 1, 2, 3, 4, 5]
[1, 3, 4, 5, 8, 9]

Jak widać, wynikiem w każdym przypadku jest lista.

Lista słowników

Możesz także zastosować funkcję sortowania, aby posortować listę słowników. Jednak sortowanie słowników jest nieco bardziej skomplikowane. Dzieje się tak dlatego, że w przeciwieństwie do liczb lub ciągów znaków słownik ma wiele właściwości, z których każda jest równie ważna do porównania.

Tak więc, aby posortować słowniki, określasz funkcję, która podsumuje cały słownik do jednej wartości, która będzie używana do porównania. Ta funkcja zostanie przekazana do posortowanej funkcji jako kluczowy argument. Oto przykład dla zilustrowania:

people = [
        { 'name': 'Alice', 'age': 27 },
        { 'name': 'Bob', 'age':  23 },
        { 'name': 'Charlie', 'age': 25}
]

people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)

W tym przykładzie mamy trzy osoby reprezentowane przez obiekt słownika. Każdy obiekt ma atrybut nazwy i wieku. Chcemy posortować ludzi według wieku. Dlatego, gdy wywołujemy posortowaną funkcję, przekazujemy funkcję jako kluczowy argument.

Ta funkcja przyjmie obiekt słownika osoby i zwróci jej wiek. Wartość zwracana przez ten klucz zostanie użyta do sortowania. Dlatego cały słownik został podsumowany w prostej liczbie całkowitej, którą można porównać. Dla uproszczenia użyłem funkcji lambda do zdefiniowania kluczowego argumentu.

Uruchomienie kodu spowoduje wyświetlenie następującego wyniku:

[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

Przypadek użycia kluczowego argumentu

Argument key nie musi być używany tylko podczas sortowania słowników. Możesz go używać na wszystkich wartościach. Jego użycie polega na zapewnieniu klucza, którego można użyć do sortowania wartości. Oto przykładowe przypadki użycia:

  • Sortowanie wartości poprzez zdefiniowanie funkcji klucza, która przyjmuje wartość i zwraca długość wartości.
  • Sortowanie ciągów znaków na liście bez uwzględniania wielkości liter. Aby to zrobić, każdy ciąg na liście można przekonwertować na małe litery. Można to osiągnąć poprzez zdefiniowanie funkcji klucza, która przyjmuje wartość klucza ciągu i zwraca wersję łańcucha oznaczoną małymi literami.
  • Sortowanie wartości na podstawie wartości złożonej, która łączy wartości innych wpisów.

Złożoność środowiska wykonawczego posortowanej funkcji

Posortowana funkcja ma złożoność czasową O(n log n), gdzie n to liczba elementów w iterowalnym wejściu. Ta złożoność wynika z faktu, że funkcja wykorzystuje algorytm Timsort, który jest hybrydowym algorytmem sortowania opartym na sortowaniu przez scalanie i sortowaniu przez wstawianie.

Złożoność przestrzenna funkcji to O(n), gdzie n to wciąż liczba elementów na wejściu. Dzieje się tak, ponieważ nowa lista jest tworzona i zwracana.

Sortowana funkcja a funkcja sortująca

Inną opcją sortowania wartości jest funkcja sortowania. W tej sekcji wyjaśniono kluczowe różnice między funkcjami sortowania i sortowania.

  • Funkcja sort modyfikuje iterowalność w miejscu, podczas gdy funkcja sortowana tworzy nową listę i zwraca ją.
  • Ponieważ modyfikacje są przeprowadzane na miejscu, sortowanie wymaga, aby dane wejściowe były listą. Z drugiej strony sorted może przyjmować dowolne iterowalne dane wejściowe, które następnie zostaną użyte do utworzenia nowej listy, która zostanie zmodyfikowana i zwrócona.

Ostatnie słowa

W tym artykule omówiliśmy funkcję sortowaną — czym jest, jak jej używać i jakie przyjmuje różne argumenty. Omówiliśmy również różne przykłady użycia funkcji i jej złożoność w czasie wykonywania oraz porównaliśmy ją z funkcją sortowania.

Następnie możesz przeczytać nasz artykuł na temat funkcji sumy w Pythonie.