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, |

python_users data_users
Anna
Maria
Bob
Li
{'Anna', 'Bob', 'Maria', 'Li'}
python_users | data_users — każdy, kto jest przynajmniej w jednej grupie
union.py
print(set(python_users) | set(data_users))

Przecięcie — intersection, &

python_users data_users
Anna
Maria
Bob
Li
{'Bob'}
python_users & data_users – która należy do OBU grup
intersection.py
print(set(python_users) & set(data_users))

Różnica – difference, -

python_users data_users
Anna
Maria
Bob
Li
{'Anna', 'Maria'}
python_users - data_users — tylko w pierwszej grupie
difference.py
print(set(python_users) - set(data_users))

Różnica symetryczna — symmetric_difference, ^

python_users data_users
Anna
Maria
Bob
Li
{'Anna', 'Maria', 'Li'}
python_users^data_users – w tej samej grupie, ale nie w obu jednocześnie
symmetric_difference.py
print(set(python_users) ^ set(data_users))
ChirurgiaOperatorMetoda
zjednoczeniea | ba.union(b)
skrzyżowaniea & ba.intersection(b)
różnicaa - ba.difference(b)
różnica symetrycznaa ^ ba.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
available required
python
git
docker
linux
required < = available — required (wewnętrzne koło) leży całkowicie wewnątrz available (zewnętrznego koła)
Operator / metodaZnaczenie
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
Otwórz praktykę →