0Pricing
Competitive Programming Academy · Lekcja

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 0

Połą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))   # 34330

Liczy 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

  1. sorted() i funkcja key
  2. Sortowanie według wielu pól
  3. Własna kolejność z functools.cmp_to_key
  4. Dlaczego sortowanie odblokowuje rozwiązania
← Powrót do Competitive Programming Academy