Wyjaśnienie lekcji
Pod koniec tej lekcji będziesz potrafić:
W poprzedniej lekcji wyrażenie listowe utworzyło listę z obiektu iterowalnego. Wyrażenia słownikowe (dictionary comprehensions) używają nawiasów klamrowych z parą key: value:
new_dict = {key_expression: value_expression for item in source}Użyj .items(), aby przetwarzać klucze i wartości słownika razem; dodaj końcowe if, aby wykluczyć wpisy. Słownik zachowuje jedną wartość na klucz. Jeśli wiele wpisów wejściowych daje ten sam klucz, późniejszy wynik zastępuje wcześniejszą wartość. Kolekcja źródłowa nie jest zmieniana.
Wyrażenie zbiorowe (set comprehension) także używa nawiasów klamrowych, ale nie ma dwukropka:
new_set = {expression for item in source}Zbiory zachowują unikalne wartości, ale kolejność iteracji nie jest gwarantowana. Gdy wynik wymaga przewidywalnej kolejności, posortuj powstały zbiór przed wypisaniem lub zwróceniem go jako listy. Podobnie jak przy wyrażeniach listowych, wybierz zwykłą pętlę, jeśli przekształcenie ma kilka kroków lub efekty uboczne.
Wybierz klucz i wartość pochodną dla każdego elementu:
packages = ["api", "worker", "mailer"]
name_lengths = {package: len(package) for package in packages}
print(name_lengths)Wynik:
{'api': 3, 'worker': 6, 'mailer': 6}Każdy pakiet staje się kluczem; jego długość staje się wartością.
Użyj .items(), aby uzyskać dostęp do obu części każdego wpisu:
balances = {"ops": 55, "research": 20, "support": 80}
raised = {team: amount + 10 for team, amount in balances.items() if amount >= 50}
print(raised)Wynik:
{'ops': 65, 'support': 90}Wpis research jest wykluczony, a oryginalny słownik nadal zawiera swoje pierwotne wartości.
Wyrażenie zbiorowe zachowuje każdą różną oczyszczoną etykietę tylko raz:
raw_labels = [" Backend ", "backend", "DATA", "data "]
labels = {value.strip().lower() for value in raw_labels}
print(sorted(labels))Wynik:
['backend', 'data']Używamy sorted() dla przewidywalnego wyświetlania — nie dlatego, że sam zbiór ma posortowaną kolejność.
Gdy różne wartości generują ten sam klucz, wygrywa późniejsze przypisanie:
entries = ["DEV", "dev", "Test"]
last_seen = {name.lower(): name for name in entries}
print(last_seen)Wynik:
{'dev': 'dev', 'test': 'Test'}Oba pierwsze wpisy generują dev; późniejsza oryginalna wartość nadpisuje wcześniejszą.
| Zamiar | Składnia |
|---|---|
| Słownik z elementów | {key: value for item in source} |
| Filtrowanie słownika | {k: v for k, v in source.items() if condition} |
| Zbiór unikalnych wartości | {expression for item in source} |
| Przewidywalne wyświetlanie | sorted(your_set) |
if stoją po części for, a nie przed nią.{} dla słownika albo set() dla zbioru.