Mulțimi
Mulțimea (set) reprezintă un alt tip de colecție care stochează doar elemente unice. Pentru a defini o mulțime, se folosesc acolade în care sunt enumerate elementele:
users = {"Tom", "Bob", "Alice", "Tom"}
print(users) # {"Alice", "Bob", "Tom"}
Observați că, deși funcția print a afișat elementul "Tom" o singură dată, deși acesta este prezent de două ori în definiția mulțimii. Acest lucru se datorează faptului că mulțimea conține doar valori unice.
De asemenea, pentru a defini o mulțime poate fi utilizată funcția set(), în care se transmite o listă sau un tuplu de elemente:
people = ["Mike", "Bill", "Ted"]
users = set(people)
print(users) # {"Mike", "Bill", "Ted"}
Funcția set este convenabilă pentru crearea unei mulțimi goale:
users = set()
Pentru a obține lungimea mulțimii se folosește funcția integrată len():
users = {"Tom", "Bob", "Alice"}
print(len(users)) # 3
Adăugarea elementelor
Pentru adăugarea unui singur element se folosește metoda add():
users = set()
users.add("Sam")
print(users)
Ștergerea elementelor
Pentru ștergerea unui element se folosește metoda remove(), căreia i se transmite elementul de șters. Dar trebuie să ținem cont că, dacă un astfel de element nu se află în mulțime, va fi generată o eroare. De aceea, înainte de ștergere, este recomandat să verificăm existența elementului folosind operatorul in:
users = {"Tom", "Bob", "Alice"}
user = "Tom"
if user in users:
users.remove(user)
print(users) # {"Bob", "Alice"}
De asemenea, pentru ștergere poate fi utilizată metoda discard(), care nu va genera excepții în cazul absenței elementului:
users = {"Tom", "Bob", "Alice"}
users.discard("Tim") # elementul "Tim" lipsește, iar metoda nu face nimic
print(users) # {"Tom", "Bob", "Alice"}
users.discard("Tom") # elementul "Tom" este prezent, iar metoda îl șterge
print(users) # {"Bob", "Alice"}
Pentru a șterge toate elementele se folosește metoda clear():
users.clear()
Parcurgerea mulțimii
Pentru a parcurge elementele se poate folosi ciclul for:
users = {"Tom", "Bob", "Alice"}
for user in users:
print(user)
La parcurgere, fiecare element este plasat în variabila user.
Operații cu mulțimi
Cu ajutorul metodei copy() putem copia conținutul unei mulțimi într-o altă variabilă:
users = {"Tom", "Bob", "Alice"}
students = users.copy()
print(students) # {"Tom", "Bob", "Alice"}
Unirea mulțimilor
Metoda union() unește două mulțimi și returnează o nouă mulțime:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
users3 = users.union(users2)
print(users3) # {"Bob", "Alice", "Sam", "Kate", "Tom"}
În locul metodei union() am putea folosi operația de adunare logică - |:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
print(users | users2) # {"Bob", "Alice", "Sam", "Kate", "Tom"}
Intersecția mulțimilor
Intersecția mulțimilor permite obținerea doar a acelor elemente care sunt simultan în ambele mulțimi. Metoda intersection() realizează operația de intersecție a mulțimilor și returnează o nouă mulțime:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
users3 = users.intersection(users2)
print(users3) # {"Bob"}
În locul metodei intersection am putea folosi operația de înmulțire logică:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
print(users & users2) # {"Bob"}
În acest caz am obține același rezultat.
Modificarea metodei - intersection_update() înlocuiește elementele intersecției în prima mulțime:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
users.intersection_update(users2)
print(users) # {"Bob"}
Diferența dintre mulțimi
O altă operație - diferența dintre mulțimi returnează acele elemente care sunt în prima mulțime, dar lipsesc în a doua. Pentru a obține diferența dintre mulțimi putem folosi metoda difference sau operația de scădere:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
users3 = users.difference(users2)
print(users3) # {"Tom", "Alice"}
print(users - users2) # {"Tom", "Alice"}
O varietate specială a diferenței dintre mulțimi - diferența simetrică se realizează cu ajutorul metodei symmetric_difference() sau cu ajutorul operației ^. Aceasta returnează toate elementele ambelor mulțimi, cu excepția celor comune:
users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}
users3 = users.symmetric_difference(users2)
print(users3) # {"Tom", "Alice", "Sam", "Kate"}
users4 = users ^ users2
print(users4) # {"Tom", "Alice", "Sam", "Kate"}
Relațiile dintre mulțimi
Metoda issubset permite verificarea dacă mulțimea curentă este un submulțimă (adică o parte) a unei alte mulțimi:
users = {"Tom", "Bob", "Alice"}
superusers = {"Sam", "Tom", "Bob", "Alice", "Greg"}
print(users.issubset(superusers)) # True
print(superusers.issubset(users)) # False
Metoda issuperset, dimpotrivă, returnează True dacă mulțimea curentă este un supermulțime (adică conține) pentru o altă mulțime:
users = {"Tom", "Bob", "Alice"}
superusers = {"Sam", "Tom", "Bob", "Alice", "Greg"}
print(users.issuperset(superusers)) # False
print(superusers.issuperset(users)) # True
frozen set
Tipul frozen set reprezintă un tip de mulțimi care nu poate fi modificat. Pentru a-l crea se folosește funcția frozenset:
users = frozenset({"Tom", "Bob", "Alice"})
În funcția frozenset se transmite un set de elemente - listă, tuplu, altă mulțime.
Într-o astfel de mulțime nu putem adăuga elemente noi și nici nu putem șterge elementele existente. Din acest motiv, frozen set acceptă un set limitat de operații:
- len(s): returnează lungimea mulțimii
- x in s: returnează True dacă elementul x este prezent în mulțimea s
- x not in s: returnează True dacă elementul x lipsește în mulțimea s
- s.issubset(t): returnează True dacă t conține mulțimea s
- s.issuperset(t): returnează True dacă t este conținută în mulțimea s
- s.union(t): returnează unirea mulțimilor s și t
- s.intersection(t): returnează intersecția mulțimilor s și t
- s.difference(t): returnează diferența dintre mulțimile s și t
- s.copy(): returnează o copie a mulțimii s