Własna kolejność z functools.cmp_to_key
Pisanie komparatora, gdy klucze nie wystarczają
Własna kolejność z functools.cmp_to_key to bezpłatna lekcja Competitive Programming Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Competitive Programming Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.
Gdy klucz nie potrafi tego wyrazić
Niektóre porządki zależą od porównania dwóch elementów ze sobą, a nie od osobnej wartości każdego z nich. W takich przypadkach należy napisać funkcję komparatora zamiast klucza.
Co zwraca komparator
Komparator przyjmuje dwa elementy a i b. Należy zwrócić liczbę ujemną, jeśli a powinno wystąpić wcześniej, dodatnią, jeśli wcześniej powinno wystąpić b, oraz zero, gdy elementy są równorzędne.
def cmp(a, b):
if a < b: return -1
if a > b: return 1
return 0Połączenie za pomocą cmp_to_key
Sortowanie w Pythonie przyjmuje tylko klucz, dlatego komparator należy opakować za pomocą functools.cmp_to_key, aby przekształcić go w użyteczny klucz.
from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))Klasyczny problem największej liczby
Aby połączyć liczby w największy napis, należy porównywać pary według tego, która konkatenacja jest większa. Zwykły klucz nie potrafi tego wyrazić.
def cmp(a, b):
return (a + b < b + a) - (a + b > b + a)Odczytanie sztuczki z porównaniem
Wyrażenie zwraca -1, gdy a+b daje większy wynik konkatenacji, więc a jest sortowane przed b. W ten sposób powstaje największa możliwa liczba.
nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums)) # 34330Liczy się znak
Sortowanie bierze pod uwagę wyłącznie znak wyniku. Zwrócenie -2 lub -100 działa tak samo jak -1, więc nie należy przejmować się dokładną wartością bezwzględną.
Spójność komparatorów
Komparator musi być spójny: jeśli a wygrywa z b, a b wygrywa z c, to a musi wygrywać z c. Sprzeczności prowadzą do bezsensownej kolejności.
Jeśli to możliwe, należy wybrać key
key jest obliczany raz dla każdego elementu, natomiast komparator działa na wielu parach i jest wolniejszy. cmp_to_key należy stosować tylko wtedy, gdy klucz rzeczywiście nie wystarcza.
Skrót z odejmowaniem
Przy porównywaniu liczb można bezpośrednio zwrócić a - b, ponieważ znak wyniku już określa kolejność. To krótkie i bezpieczne rozwiązanie dla liczb całkowitych.
items.sort(key=cmp_to_key(lambda a, b: a - b))Uwaga na liczby zmiennoprzecinkowe
W przypadku liczb zmiennoprzecinkowych a - b może zostać zaokrąglone do bardzo małej wartości albo do zera. Należy stosować jawne rozgałęzienia, aby uniknąć błędnego uznania wartości za równe.
Komparatory odblokowują niestandardowe porządki
Kolejność konkatenacji, niestandardowe rankingi i remisy rozstrzygane według reguł stają się możliwe. Komparator jest rozwiązaniem awaryjnym dla trudnych sortowań.
Szybki sprawdzian
Komparator zwraca liczbę ujemną dla cmp(a, b).
Podsumowanie
Można opakować komparator za pomocą cmp_to_key, aby uzyskać porządki, których nie da się wyrazić kluczem. Należy zwracać odpowiedni znak, zachowywać spójność i wybierać klucze, gdy tylko jest to możliwe. 🧩
Często zadawane pytania
Czy lekcja „Własna kolejność z functools.cmp_to_key” jest bezpłatna?
Tak — pełny tekst „Własna kolejność z functools.cmp_to_key” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Competitive Programming Academy, przejdź na CoddyKit PRO. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Własna kolejność z functools.cmp_to_key”?
Pisanie komparatora, gdy klucze nie wystarczają Ćwiczysz Competitive Programming Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Competitive Programming Academy?
Nie wymagamy żadnego doświadczenia. Competitive Programming Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Własna kolejność z functools.cmp_to_key”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Competitive Programming Academy?
Tak. Każda lekcja Competitive Programming Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- sorted() i funkcja key
- Sortowanie według wielu pól
- Własna kolejność z functools.cmp_to_key
- Dlaczego sortowanie odblokowuje rozwiązania