Moduł kolekcji Pythona: zaawansowane typy kontenerów

Naucz się korzystać z modułu kolekcji Pythona. Licznik główny, defaultdict, Nametuple, deque i sposoby upraszczania złożonych struktur danych.

Spróbuj w Edytorze

Przegląd

Chociaż podstawowe kontenery Pythona — listy, słowniki, zbiory i krotki — wystarczą do większości zadań, złożone programy często wymagają wyspecjalizowanych struktur danych. Aby rozwiązać ten problem, Python udostępnia wbudowany moduł „kolekcji”. Moduł ten zawiera wysokowydajne kontenerowe typy danych zaprojektowane w celu wydajniejszego rozwiązywania typowych zadań programistycznych przy użyciu czystszej i bardziej samodokumentującej się składni.

Do najbardziej przydatnych klas należy `defaultdict`, która działa jak zwykły słownik, ale automatycznie inicjuje brakujące klucze wartością domyślną (np. pustą listą lub liczbą całkowitą zero), eliminując potrzebę szczegółowego sprawdzania kluczy. Kolejną potęgą jest klasa „Licznik”, specjalnie zoptymalizowana pod kątem zliczania wystąpień elementów w obiekcie iterowalnym. W przypadku szybkich kolejek i stosów „deque” (kolejka dwustronna) oferuje wstawianie i usuwanie „O(1)” na obu końcach, w przeciwieństwie do list, które cierpią z powodu przesunięć „O(N)”.

Na koniec moduł oferuje opcję `namedtuple`, która tworzy lekkie, przypominające krotkę obiekty, do których można uzyskać dostęp za pomocą notacji kropkowej oraz tradycyjnych indeksów (np. `point.x` zamiast `point[0]`). Daje to szybkość i niezmienność krotki z czytelnością klasy. Włączenie modułu kolekcji do przepływu pracy gwarantuje, że Twój kod pozostanie elegancki, wydajny i czysty.

Dane wyjściowe kodu i wykonania

Liczenie słów za pomocą licznika i organizowanie grup słowników za pomocą defaultdict.

collections_demo.py
Spróbuj w Edytorze
from collections import Counter, defaultdict, namedtuple

# 1. Counter: Tallying items
votes = ["yes", "no", "yes", "yes", "no"]
vote_counts = Counter(votes)
print(f"Vote Counts: {vote_counts}")
print(f"Most common: {vote_counts.most_common(1)}")

# 2. defaultdict: Grouping values
grouped_data = defaultdict(list)
grouped_data["engineers"].append("Alice")
grouped_data["engineers"].append("Bob")
print(f"Grouped Data: {dict(grouped_data)}")

# 3. namedtuple: Clean records
Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print(f"Point x: {p.x}, Point y: {p.y}")
Wyjście terminala
Vote Counts: Counter({'yes': 3, 'no': 2})
Most common: [('yes', 3)]
Grouped Data: {'engineers': ['Alice', 'Bob']}
Point x: 10, Point y: 20

Wdrażanie krok po kroku

  • Analizowanie plików dziennika w celu zliczania wystąpień błędów za pomocą licznika
  • Budowanie kolejek priorytetowych lub harmonogramów zadań za pomocą deque
  • Reprezentowanie wymiarów współrzędnych lub rekordów danych przy użyciu nazwanej krotki

Często zadawane pytania

Dlaczego deque jest szybsze niż lista dla operacji w kolejce?

Lista wymaga przesuwania wszystkich kolejnych elementów w pamięci podczas wstawiania lub usuwania od przodu (O(N)). Deque jest zaimplementowane jako podwójnie połączona lista, umożliwiająca operacje O(1) na obu końcach.

Czy mogę zmienić elementy nazwanej krotki?

Nie. Ponieważ nazwane krotki dziedziczą po krotkach standardowych, są w pełni niezmienne. Aby zwrócić nową zmodyfikowaną instancję, należy użyć metody ._replace().

Powiązane tematy

Polecane zasoby Pythona

Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.