Rozdział 11 · Mnóstwo informacji!
Operacje setów i możliwość hasowania
Cztery operacje algebry zbiorów na diagramach Venna — i dlaczego lista nie można umieścić wewnątrz zbioru.
Zbiory jako okręgi na diagramie Venna
Dwie grupy uczestników kursu są wygodnym przykładem, który pokazuje wszystkie cztery operacje jednocześnie:
dve_gruppy.py
python_users = ['Anna', 'Bob', 'Maria']
data_users = ['Bob', 'Li']
Zjednoczenie – union, |
Anna
Maria
Bob
Li
→ {'Anna', 'Bob', 'Maria', 'Li'}
union.py
print(set(python_users) | set(data_users))
Przecięcie — intersection, &
Anna
Maria
Bob
Li
→ {'Bob'}
intersection.py
print(set(python_users) & set(data_users))
Różnica – difference, -
Anna
Maria
Bob
Li
→ {'Anna', 'Maria'}
difference.py
print(set(python_users) - set(data_users))
Różnica symetryczna — symmetric_difference, ^
Anna
Maria
Bob
Li
→ {'Anna', 'Maria', 'Li'}
symmetric_difference.py
print(set(python_users) ^ set(data_users))
| Chirurgia | Operator | Metoda |
|---|---|---|
| zjednoczenie | a | b | a.union(b) |
| skrzyżowanie | a & b | a.intersection(b) |
| różnica | a - b | a.difference(b) |
| różnica symetryczna | a ^ b | a.symmetric_difference(b) |
Pod zbiór i nad zbiór
podmnozhestvo.py
required = {"python", "git"}
available = {"python", "git", "docker", "linux"}
print(required <= available) #True – required jest CAŁKOWICIE zawarty w available
print(required.issubset(available)) # tak samo
python
git
docker
linux
| Operator / metoda | Znaczenie |
|---|---|
a <= b / a.issubset(b) | wszystkie elementy a znajdują się w b |
a >= b / a.issuperset(b) | wszystkie elementy b znajdują się w a |
a.isdisjoint(b) | a i b nie mają w ogóle wspólnych elementów |
Hashowalność: dlaczego niemożliwe jest przechowywanie lista w zbiorze
hashability_error.py
bad = {[1, 2], [3, 4]}
# TypeError: cannot use 'list' as a set element (unhashable type: 'list')
Elementy zbioru i klucze słownika powinny być wystarczająco „stabilne”
Python musi być pewny, że wartość wewnątrz zbioru (lub klucz słownika) nie zmieni się niezauważalnie, dopóki tam jest. Formalny termin na taką stabilność — hashowalność (hashable). Typy zmienne (lista, słownik, zbiór) nie są z tego powodu haszalne.
Co można umieścić w zbiór / używać jako klucz słownikowy
Zwykle haszowalne
int, float, str
bool, bytes
tuple jeśli wszystkie elementy są również hashowalne
frozenset
Nie są hashowane
list
dict
set
frozenset jest niezmiennym zbiór
frozenset_primer.py
zamorozhennoe = frozenset({"python", "git"})
print(zamorozhennoe)
# zamorozhennoe.add(„docker”
Kiedy przyda się frozenset
frozenset jest potrzebny, gdy zbiór sam musi być hashowalny, na przykład, aby użyć go jako elementu innego zbioru lub jako klucza słownikowego, co ma miejsce w przypadku klucza regularnego set niemożliwe.Praktyka: algebra zbiorów, podzbiory, hasowalność
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji