Multimi in Python
In limbajul Python, multimile reprezinta colectii neordonate de elemente care nu permit duplicate. Declararea multimilor se realizeaza prin intermediul acoladelor. La nivelul unei structuri de tip multime putem interveni cu operatii de stergere si adaugare, motiv pentru care spunem ca multimile sunt structuri de date de tip mutabil.
>>> orase = {'Timisoara', 'Londra', 'Budapesta', 'New York'} >>> orase.add('Sofia') >>> orase {'Timisoara', 'Budapesta', 'Londra', 'New York', 'Sofia'} >>> orase.remove('Timisoara) >>> orase {'Budapesta', 'Londra', 'New York', 'Sofia'}
Multimile sunt structuri de date de tip mutabil, dar nu pot contine elemente care au caracter mutabil, precum: listele, dictionarele sau alte multimi. Prin urmare, in cazul multimilor nu exista posibilitatea imbricarii lor.
>>> numere = {1, 2, {1, 3}, [2, 5], {1: 2, 3: 5}} Traceback (most recent call last): File "", line 1, in TypeError: unhashable type: 'set'
Putem verifica daca o valoare este sau nu prezenta printre elementele unei multimi folosind operatorii in, respectiv not in.
>>> 'Londra' in orase True >>> 'Timisoara' not in orase True
Crearea unei multimi
Crearea unei structuri de date de tip multime se realizeaza prin precizarea elementelor acesteia intre acolade. Despartirea elementelor in multime se face prin virgula. Elementele de la nivelul unei multimi nu trebuie sa detina acelasi tip de date.
>>> a1 = {'Timisoara', 3.14, 'Ioana', 1024} >>> type(a1) <class 'set'>
>>> a2 = set({'Timisoara', 'Sofia', 'Budapesta'}) >>> type(a2) <class 'set'>
Crearea unei multimi se poate face si prin intermediul constructorului set(). In cazul in care nu sunt precizate elemente ale multimii, se creeaza o miltime goala.
>>> empty = set() >>> empty set()
Constructorul clasei set permite si crearea unei structuri de date de tip multime dintr-o structura iterabila.
>>> set([1, 2, 3, 4]) {1, 2, 3, 4} >>> set({1, 2, 3, 4}) {1, 2, 3, 4 >>> set({1: 'A', 2: 'B', 3: 'C', 4: 'D'}) {1, 2, 3, 4}
Accesarea elementelor unei multimi
Elementele unei multimi nu sunt indexate numeric, prin urmare nu exista posibilitatea accesarii lor. Accesarea elementelor se face global prin intermediul intregii multimi.
>>> orase {'Budapesta', 'Londra', 'New York', 'Sofia'}
>>> orase[1] Traceback (most recent call last): File "", line 1, in TypeError: 'set' object does not support indexing
Adaugarea si actualizarea elementelor unei multimi
Actualizarea structurilor de date de tip multime se face prin intermediul a doua metode: add(), respectiv update(). Metoda add() permite adaugarea unei valori ca si element al unei structuri de tip set.
>>> orase = {'Timisoara', 'Londra', 'Budapesta', 'New York'} >>> orase.add('Sofia') >>> orase ['Timisoara', 'Londra', 'Budapesta', 'New York', 'Sofia']
Metoda update() permite adaugarea mai multor elemente la o multime prin intermediul unei singure operatii. Elementele care sunt deja prezente la nivelul multimii nu vor mai fi adaugate.
>>> numere = {1, 3, 5, 7} >>> numere.update({1, 2, 4, 6}) >>> numere {1, 2, 3, 4, 5, 6, 7}
Stergerea multimilor si eliminarea elementelor
Pentru stergerea unei multimi este necesara precizarea cuvantului cheie del inaintea numelui multimii ce urmeaza a fi sterse.
>>> orase = {'Timisoara', 'Londra', 'Budapesta', 'New York'} >>> del orase >>> orase Traceback (most recent call last): File "", line 1, in NameError: name 'orase' is not defined
Stergerea elementelor de la nivelul unei multimi se poate realiza prin intermediul unor metode predefinite, precum: discard() si remove(). Astfel, metoda discard() sterge elementul precizat ca si argument de la nivelul multimii. Daca valoare precizata ca si argument nu este prezenta la nivelul multimii, metoda returneaza None.
>>> orase = {'Timisoara', 'Londra', 'Budapesta', 'New York'} >>> orase {'Timisoara', 'Budapesta', 'Londra', 'New York'} >>> orase.discard('Timisoara') >>> orase.discard('Roma') >>> print(orase.discard('Tokio')) None
In mod similar metodei discard(), si metoda remove() sterge elementul precizat ca si argument. Daca valoare precizata ca si argument nu este prezenta la nivelul multimii, este generata o eroare de tip KeyError.
>>> orase = {'Budapesta', 'Londra', 'New York'} >>> orase.remove('Londra') >>> orase.remove('Roma') Traceback (most recent call last): File "", line 1, in KeyError: 'Roma' >>> orase {'Budapesta', 'New York'}
Stergerea tuturor elementelor unei multimi poate fi obtinuta prin intermediul metodei predefinite clear().
>>> orase = {'Timisoara', 'Londra', 'Budapesta', 'New York'} >>> orase.clear() >>> orase {}
O alta metode care are in vedere stergerea elementelor este pop(), metoda care permite stergerea unui element ales aleator, returnandu-i valoarea in acelasi timp.
>>> orase = {'Timisoara', 'Londra', 'Budapesta', 'New York'} >>> orase.pop() 'Timisoara' >>> orase {'Budapesta', 'Londra', 'New York'}
Parcurgerea elementelor unei multimi
Elementele de la nivelul unei structuri de date de tip multime pot fi parcurse prin intermediul unei iteratii for.
>>> for oras in {'Timisoara', 'Londra', 'Budapesta', 'New York'}: ... print(oras) ... Timisoara Budapesta Londra New York
Metode predefinite pentru multimi
Limbajul Python ofera metode predefinite ce pot fi referite de obiectele de tip multime. In afara metodelor care permit adaugarea de elemente (add() si update()), sau stergerea elementelor (remove(), discard(), clear() si pop()), la nivelul structurilor de date de tip multime mai sunt disponibile metode care implementeaza operatii specifice multimilor: reuniunea, intersectia, difereanta.
Metoda | Semnificatie |
---|---|
add() | adauga un element la multime |
update() | adauga mai multe elemente le multime |
remove() | sterge elementul specificat de la nivelul multimii |
discard() | sterge elementul specificat de la nivelul multimii |
pop() | sterge un element aleator de la nivelul multimii si il returneaza |
copy() | returneaza o copie a multimii |
clear() | sterge toate elementele din multime |
>>> s1 = {1, 3, 5} >>> s2 = {2, 3, 4} >>> s1.union(s2) {1, 2, 3, 4, 5} >>> s1.intersection(s2) {3} >>> s1.difference(s2) {1, 5}
>>> s1.symmetric_difference(s2) {1, 2, 4, 5} >>> s1.intersection_update(s2) >>> s1 {3} >>> s1.difference_update(s2) >>> s1 set()
Functii predefinite pentru multimi
Structurile de date de tip multime beneficiaza de o serie de functii predefinite care permit, printre altele, determinarea numarului de elemente de la nivelul multimii, a valorii maxime sau minime de la nivelul elementelor multimii, a sumei elementelor multimii.
Functie | Semnificatie |
---|---|
len() | numarul de elemente de la nivelul multimii |
max() | valoarea maxima de la nivelul multimii |
min() | valoarea minima de la nivelul multimii |
sum() | suma valorilor elementelor de la nivelul multimii |
sorted() | returneaza o lista care contine elementele multimii ordonate crescator |
any() | True daca cel putin un element din mltime are valoarea True |
all() | True daca toate elementele multimii se evalueaza la True |
>>> numere = {10, 4, 7, 5, 34, 6, 78} >>> len(numere) 7 >>> max(numere) 78 >>> min(numere) 4 >>> sum(numere) 144
Functia sorted returneaza o lista care contine elementele multimii primite ca argument ordonate crescator.
>>> sorted({10, 4, 7, 5, 34, 6, 78}) [4, 5, 6, 7, 10, 34, 78]
Functiile any() si all() returneaza True daca cel putin un element de la nivelul multimii are valoarea True, sau daca toate elementele de la nivelul multimii se evalueaza la True.
>>> any({0, False, 0.0, ''}) False >>> all({0, 1, 2, 3, 4}) False
Python Set Comprehension
Termenul set comprehension se refera la crearea unei multimi noi dintr-o multime existenta pe baza unei expresii urmate de una sau mai multe instructiuni for si/sau if.
Daca se doreste crearea unei multimi care contine toate orasele care incep cu litere din prima parte a alfabetului, putem avea in vedere urmatorul script.
>>> orase = {'Timisoara', 'Amsterdam', 'Paris', 'Caransebes', 'Cluj-Napoca', 'Iasi'} >>> orase_new = {} >>> for oras in orase: ... if oras[0] < 'M': ... orase_new.add(oras) ... >>> print(orase_new) {'Amsterdam', 'Cluj-Napoca', 'Caransebes', 'Iasi'}
Secventa de cod precedenta poate fi rescrisa folosind set comprehension, astfel:
>>> orase_new = {oras for oras in orase if oras[0] < 'M'} >>> print(orase_new) {'Amsterdam', 'Cluj-Napoca', 'Caransebes', 'Iasi'}