Tupluri in Python
In limbajul Python, tuplurile sunt structuri de date similare listelor, dar care nu beneficiaza de caracterul mutabil al acestora. Prin urmare, elementele unui tuplu nu pot fi modificate. Declararea tuplurilor se realizeaza prin intermediul parantezelor rotunde, cum poate fi observat si in exemplul urmator.
zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> type(zile) <class 'tuple'>
>>> zile[0] = 'Monday' Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment
Si tuplurile fac parte din categoria datelor de tip secventa, alaturi de liste si siruri, preluand caracteristicile acestora (indexarea elementelor, concatenarea, multiplicarea cu valori numerice si felierea.
Elementele unui tuplu sunt indexate numeric, primul element avand indexul 0. Elementele de la nivelul unui tuplu pot avea orice tip de date, existand chiar posibilitatea imbricarii tuplurilor.
>>> impar = (1, 3, 5, 7, 9, 11) >>> par = (2, 4, 6, 8, 10, 12) >>> numere = (par, impar) >>> numere[0] (2, 4, 6, 8, 10, 12) >>> numere[0][1] 4
Operatia de concatenare a doua tupluri presupune plasarea elementelor acestora la nivelul unui tuplu rezultat. In mod similar listelor, prin intermediul operatiei de multiplicare a unui tuplu cu valori numerice se obtine un nou tuplu, care cuprinde continutul tuplului initial repetat de un numar de ori egal cu valoare numerica cu care a fost multiplicat tuplul initial.
>>> impar + par (1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12)
>>> par * 2 (2, 4, 6, 8, 10, 12, 2, 4, 6, 8, 10, 12)
De asemenea, exista posibilitatea verificarii unei valori printre elementele unui tuplu prin intermediul operatorului de verificare a apartenentei.
>>> 'vineri' in zile True >>> 'monday' in zile False
Crearea unui tuplu
Crearea unui tuplu se face prin precizarea elementelor acestuia intre paranteze rotunde. Despartirea elementelor de la nivelul unui tuplu se realizeaza prin virgula.
a = ('Timisoara', 3.14, 'Ioana', 1024) >>> type(a) <class 'tuple'>
Tuplurile pot fi create si fara paranteze rotunde, prin precizarea unei secvente de elemente despartite prin virgula. Acest proces poarta numele de impachetare a valorilor sau tuple packing. Procesul invers, denumit despachetare tuplu (tuple unpacking) are in vedere distribuirea valorilor de la nivelul unui tuplu unei secvente de variabile.
>>> t = 23, 17, 30 >>> type(t) <class 'tuple'> >>> t (23, 17, 30)
>>> a, b, c = 12, 8, 13 >>> a, b, c = t >>> a 23
Crearea unui tuplu se face si prin intermediul constructorului tuple(). Daca nu sunt precizate elementele tuplului, se creeaza un tuplu vid.
>>> empty1 = () >>> type(empty1) <class 'tuple'>
>>> empty2 = tuple() >>> type(empty2) <class 'tuple'>
Pentru un tuplu cu un singur element este obligatorie precizarea virgulei dupa primul element. Daca nu este respectata aceasta regula, nu vor fi create structuri de date de tip tuplu.
>>> t1 = 2, >>> type(t1) <class 'tuple'> >>> n1 = 2 >>> type(n1) <class 'int'>
>>> t2 = ('Timisoara',) >>> type(t2) <class 'tuple'> >>> s2 = 'Timisoara' >>> type(s2) <class 'str'> >>> s3 = ('Timisoara') >>> type(s3) <class 'str'>
Accesarea elementelor unui tuplu
Elementele unui tuplu sunt indexate numeric, primul element al unui tuplu avand indexul 0. Accesarea unui anumit element al tuplului se face prin precizarea indexului elementului, intre paranteze drepte, dupa numele tuplului.
>>> zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> zile[6] 'duminica'
Daca indexul asociat unui element al tuplului este mai mare sau egal cu lungimea acestuia, atunci va fi generata o exceptie de tipul IndexError.
>>> zile[7] Traceback (most recent call last): File "", line 1, in IndexError: tuple index out of range
In mod similar listelor, accesarea elementelor unui tuplu se poate realiza si prin intermediul unor indecsi cu valori negative, caz in care evaluare se face incepand cu ultimul element din tuplu. De exemplu, pentru accesarea ultimului element din tuplu trebuie precizata valoarea -1 pentru index.
>>> zile[-1] 'duminica'
Stergerea tuplurilor
Stergerea unei structuri de tip tuplu poate fi realizata prin plasarea cuvantului cheie del inaintea numelui tuplului ce urmeaza a fi sters.
>>> zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> del zile >>> zile Traceback (most recent call last): File "", line 1, in NameError: name 'zie' is not defined
Deoarece tuplurile sunt structuri de date imutabile, elementele de la nivelul unui tuplu nu pot fi sterse. Cel mult pot fi sterse elemente de la nivelul unor structuri mutabile precizate ca si elemente ale unui tuplu.
>>> zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> del zile[0] Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object doesn't support item deletion
>>> numere = (2, 3, [4, 5]) >>> del numere[2][1] >>> numere (2, 3, [4])
Felierea tuplurilor
Operatia de feliere are in vedere accesarea unui sir de valori de la nivelul unui tuplu prin intermediul operatorului doua puncte :. De exemplu, in acest fel putem genera un nou tuplu care contine primele 2 elemente de la nivelul tuplului zile.
>>> zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> zile[0:2] ('luni', 'marti')
Indecsii precizati la nivelul operatiei de feliere pot avea inclusiv valori negative, acestia pastrandu-si semnificatia de la accesarea elementelor unui tuplu prin intermedul unor indecsi negativi. Si in acest caz, evaluarea elementelor se va realiza incepand cu ultimul element din tuplu. Urmatorul exemplu returneaza un nou tuplu care contine ultimele doua elemente din tuplul zile (weekend).
>>> weekend = zile[-2:] >>> weekend ('sambata', 'duminica')
In sintaxa operatiei de feliere poate aparea si un al treilea argument numeric optional, care are semnificatia de pas in evaluarea elementelor. Primul exemplu din secventa de mai jos returneaza o copie a tuplului original in care elementele sunt precizate in ordine inversa.
>>> zile[::-1] ('duminica', 'sambata', 'vineri', 'joi', 'miercuri', 'marti', 'luni')
Parcurgerea elementelor unui tuplu
Elementele de la nivelul unei structuri de date de tip tuplu pot fi parcurse prin intermediul unei iteratii for, specifica secventelor (liste, tupluri, siruri).
>>> zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> for zi in zile: ... print(zi) ... luni marti miercuri joi vineri sambata duminica
Metode predefinite pentru tupluri
Metodele predefinite disponibile in limbajul Python pentru obiectele de tip tuplu sunt index() si count(). Aceste metode permit identificarea indexului corespunzator primei aparitii a unui element la nivelul tuplului index(), respectiv determinarea numarului de aparitii al elementului precizat ca si argument la nivelul tuplului count().
Metoda | Semnificatie |
---|---|
count() | numarul de aparitii al unui element in tuplu |
index() | indexul primului element din tuplu care detine valoarea specificata |
>>> zile = ('luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica') >>> zile.index('marti') 1 >>> zile.index('monday') Traceback (most recent call last): File "", line 1, in ValueError: tuple.index(x): x not in tuple
>>> numere = (2, 4, 2, 3, 5, 6) >>> numere.count(2) 2 >>> numere.count(12) 0
Functii predefinite pentru tupluri
Structurile de date de tip tuplu beneficiaza de o serie de functii predefinite care permit, printre altele, determinarea numarului de elemente de la nivelul tuplului, a valorii maxime sau minime de la nivelul elementelor tuplului, a sumei elementelor tuplului.
Functie | Semnificatie |
---|---|
len() | numarul de elemente de la nivelul tuplului |
max() | valoarea maxima de la nivelul tuplului |
min() | valoarea minima de la nivelul tuplului |
sum() | suma valorilor elementelor de la nivelul tuplului |
sorted() | returneaza o noua lista care contine elementele tuplului ordonate crescator |
any() | True daca cel putin un element din tuplu are valoarea True |
all() | True daca toate elementele tuplului se evalueaza la True |
>>> numere = (10, 4, 7, 5, 34, 6, 78) >>> len(numere) 7 >>> max(numere) 78 >>> min(numere) 4 >>> sum(numere) 144 >>> sorted(numere) [4, 5, 6, 7, 10, 34, 78] >>> any(numere) True >>> all(numere) True