Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
key funkcji sorted().str.lower i len.Wiesz już, że sorted(values) tworzy posortowaną listę, a list.sort() zmienia istniejącą listę. Parametr key= w Pythonie czyni sortowanie bardziej elastycznym: funkcja klucza otrzymuje każdy element i zwraca wartość, którą Python porównuje.
sorted(names, key=str.lower)Dla dłuższych napisów key=len porządkuje według długości. Zauważ, że str.lower i len są przekazywane jako funkcje — bez nawiasów po ich nazwach.
Przy sortowaniu rekordów napisz małą nazwaną funkcję, która przyjmuje rekord i zwraca jego klucz rangi. Możesz zwrócić krotkę, np. (priority, name), aby rozstrzygać remisy: Python porównuje pierwszy element, a w razie potrzeby następny.
Sortowanie w Pythonie jest stabilne: jeśli dwa elementy mają równe klucze, zachowują swoją oryginalną względną kolejność. reverse=True odwraca porządek kluczy; samo w sobie nie rozwiązuje każdego wymagania z mieszanym porządkiem rosnącym i malejącym. W takich przypadkach używaj starannie dobranych kluczy.
labels = ["Worker", "api", "Cache"]
ordered = sorted(labels, key=str.lower)
print(ordered)Wynik:
['api', 'Cache', 'Worker']Oryginalna wielkość liter zostaje zachowana; tylko porównania używają małych liter.
routes = ["/health", "/", "/api"]
print(sorted(routes, key=len))Wynik:
['/', '/api', '/health']len jest przekazywane jako funkcja klucza, a nie wywoływane raz przed sortowaniem.
jobs = [
{"name": "backup", "duration": 40},
{"name": "sync", "duration": 10},
]
def duration_key(job):
return job["duration"]
ordered = sorted(jobs, key=duration_key)
print([job["name"] for job in ordered])Wynik:
['sync', 'backup']Funkcja klucza jest stosowana do każdego rekordu.
alerts = [
{"team": "Zulu", "level": 2},
{"team": "alpha", "level": 1},
{"team": "Beta", "level": 2},
]
def alert_key(alert):
return (alert["level"], alert["team"].lower())
print([item["team"] for item in sorted(alerts, key=alert_key)])Wynik:
['alpha', 'Beta', 'Zulu']Najpierw liczy się poziom liczbowy; nazwy zespołów zapisane małymi literami rozstrzygają remisy alfabetycznie.
| Cel | Technika |
|---|---|
| Kolejność tekstu bez rozróżniania wielkości liter | sorted(items, key=str.lower) |
| Kolejność według długości | sorted(items, key=len) |
| Sortowanie słowników według pola | sorted(records, key=named_function) |
| Rozstrzyganie remisów | Zwróć krotkę z funkcji klucza |
| Zachowanie listy wejściowej | Użyj sorted() zamiast .sort() |
key=str.lower, a nie key=str.lower(); to drugie wywołuje funkcję bez elementu.list.sort() modyfikuje listę i zwraca None; sorted() zwraca nową listę.lambda tylko po to, by posortować kilka rekordów — funkcje nazwane działają dobrze i pozostają czytelne.