Liste in Python
In limbajul Python, listele reprezinta colectii ordonate de elemente. Declararea listelor se realizeaza prin intermediul parantezelor drepte. Elementele unei liste pot fi modificate, motiv pentru care spunem ca listele sunt structuri de date de tip mutabil.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[1] = 'Sofia' >>> orase ['Timisoara', 'Sofia', 'Budapesta', 'New York']
O lista poate include elemente de tip lista, caz in care vorbim de liste imbricate.
>>> orase_ro = ['Timisoara', 'Bucuresti', 'Iasi'] >>> orase_uk = ['Londra', 'Glasgow', 'Liverpool'] >>> orase = [orase_ro, orase_uk] >>> orase [['Timisoara', 'Bucuresti', 'Iasi'], ['Londra', 'Glasgow', 'Liverpool']] >>> orase[1] ['Londra', 'Glasgow', 'Liverpool'] >>> orase[1][2] 'Liverpool'
Cele doua liste cu orase din Romania si Marea Britanie de mai sus pot aparea ca si operanzi intr-o operatie de concatenare. Elementele de la nivelul celor doua liste vor aparea ca si elemente ale listei rezultat dupa finalizarea operatiei de concatenare/alaturare. In cel de-al treilea exemplu elementele corespunzatoare concatenarii sunt salvate in prima lista.
>>> orase_ro = ['Timisoara', 'Bucuresti', 'Iasi'] >>> orase_uk = ['Londra', 'Glasgow', 'Liverpool'] >>> orase = orase_ro + orase_uk >>> orase ['Timisoara', 'Bucuresti', 'Iasi', 'Londra', 'Glasgow', 'Liverpool']
>>> orase_ro, orase_uk = ['Timisoara', 'Bucuresti', 'Iasi'], ['Londra', 'Glasgow', 'Liverpool'] >>> orase_ro + orase_uk ['Timisoara', 'Bucuresti', 'Iasi', 'Londra', 'Glasgow', 'Liverpool']
>>> orase = ['Timisoara', 'Bucuresti', 'Iasi'] >>> orase += ['Londra', 'Glasgow', 'Liverpool'] >>> orase ['Timisoara', 'Bucuresti', 'Iasi', 'Londra', 'Glasgow', 'Liverpool']
O alta operatie cu liste o reprezinta multiplicarea acestora cu valori numerice intregi. Rezultatul acestei operatii este o noua lista care cuprinde continutul listei initiale repetat de un numar de ori egal cu valoare numerica cu care a fost multiplicata lista initiala.
>>> orase = ['Timisoara', 'Bucuresti', 'Iasi'] >>> orase*2 ['Timisoara', 'Bucuresti', 'Iasi', 'Timisoara', 'Bucuresti', 'Iasi']
Putem verifica daca o valoare este sau nu prezenta printre elementele unei liste folosind operatorii in, respectiv not in.
>>> 'Timisoara' in orase True >>> 'Londra' not in orase True
Crearea unei liste
Crearea unei structuri de date de tip lista se realizeaza prin precizarea elementelor acesteia intre paranteze drepte. Despartirea elementelor in lista se face prin virgula. Elementele de la nivelul unei liste nu trebuie sa detina acelasi tip de date.
>>> a1 = ['Timisoara', 3.14, 'Ioana', 1024] >>> type(a1) <class 'list'>
>>> a2 = list(['Timisoara', 'Sofia', 'Budapesta']) >>> type(a2) <class 'list'>
Crearea unei liste se poate face si prin intermediul constructorului list(). In cazul in care nu sunt precizate elemente ale listei, se creeaza o lista goala.
>>> empty1 = list() >>> empty1 []
>>> empty2 = [] >>> empty2 []
Accesarea elementelor unei liste
Elementele unei liste sunt indexate numeric, primul element al unei liste avand indexul 0. Accesarea unui anumit element al listei se face prin precizarea indexului elementului, intre paranteze drepte, dupa numele listei.
>>> orase[0] 'Timisoara'
Daca indexul asociat unui element al listei este mai mare sau egal cu lungimea listei, atunci va fi generata o exceptie de tipul IndexError.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[4] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
Accesarea elementelor unei liste se poate realiza si prin intermediul unor indecsi cu valori negative, caz in care evaluare se face incepand cu ultimul element din lista. De exemplu, pentru accesarea ultimului element din lista trebuie precizata valoarea -1 pentru index.
>>> orase[-1] 'New York'
Adaugarea si actualizarea elementelor unei liste
Adaugarea unui element la o lista existenta se realizeaza prin intermediul metodei append() si presupune pozitionarea noului element la finalul acesteia.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.append('Sofia') >>> orase ['Timisoara', 'Londra', 'Budapesta', 'New York', 'Sofia']
Un element nou poate fi inserat si la o anumita pozitie, caz in care restul elementelor din lista sunt deplasate incepand cu pozitia specificata.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.insert(1, 'Sofia') >>> orase ['Timisoara', 'Sofia', 'Londra', 'Budapesta', 'New York']
O alta metoda predefinita pentru lucrul cu liste o reprezinta extend(). Aceasta metoda ofera posibilitatea adaugarii la finalul unei liste a tuturor elementelor unei alte liste, furnizate ca si argument.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.extend(['Bucuresti', 'Iasi']) >>> orase ['Timisoara', 'Londra', 'Budapesta', 'New York', 'Bucuresti', 'Iasi']
Pe langa adaugare si inserare, listele pot aparea si in operatii de actualizare a unui element, a unui sir de elemente sau a tuturor elementelor listei.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[1] = 'Sofia' >>> orase ['Timisoara', 'Sofia', 'Budapesta', 'New York'] >>> orase[1:3] = ['Amsterdam', 'Paris'] >>> orase ['Timisoara', 'Amsterdam', 'Paris', 'New York'] >>> orase[:] = ['Remetea Mare', 'Bacau', 'Praga', 'Alexandria'] >>> orase ['Remetea Mare', 'Bacau', 'Praga', 'Alexandria']
Stergerea listelor si eliminarea elementelor
Pentru stergerea unei liste este necesara precizarea cuvantului cheie del inaintea numelui listei 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
In mod similar, poate fi realizata si stergerea unui singur element din lista. De acesata data cuvantul cheie del va fi precizat pentru elementul care urmeaza a fi sters.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> del orase[0] >>> orase ['Londra', 'Budapesta', 'New York']
Stergerea tuturor elementelor unei liste poate fi obtinuta prin intermediul metodei predefinite clear().
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.clear() >>> orase []
Alte metode care au in vedere stergerea elementelor sunt: remove(), metoda care sterge prima aparitie a elementului specificat ca si argument, respectiv pop(), metoda care permite stergerea elementului de la pozitia specificata, returnandu-i valoarea in acelasi timp.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.remove('Budapesta') >>> orase ['Timisoara', 'Londra', 'New York'] >>> orase.pop(2) 'New York' >>> orase ['Timisoara', 'Londra']
Daca se doreste stergerea mai multor elemente din lista sau stergerea tuturor elementelor listei, se poate utiliza si operatorul de feliere. In primul exemplu sunt sterse doar elementele de pe pozitiile 1 si 2. In cel de-al doilea exemplu toate elementele listei sunt sterse prin inlocuirea listei cu una vida.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York', 'Bucuresti', 'Cluj-Napoca', 'Iasi'] >>> orase[1:3] = [] >>> orase ['Timisoara', 'New York', 'Bucuresti', 'Cluj-Napoca', 'Iasi']
>>> orase[:] = [] >>> orase []
Felierea listelor
Structurile de date de tip lista fac parte din categoria datelor de tip secventa (liste, siruri, tupluri), motiv pentru care pot fi indexate, concatenate, respectiv feliate.
Operatia de feliere are in vedere accesarea unui sir de valori de la nivelul listei prin intermediul operatorului doua puncte :. In acest fel putem genera o noua lista care contine primele 2 elemente de la nivelul listei orase, sau elementele ce au indecsi cu valori in intervalul 1-3. In cel de-al doilea caz operatorul de feliere va preciza valoarea [1:4].
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[0:2] ['Timisoara', 'Londra'] >>> orase[1:4] ['Londra', 'Budapesta', 'New York']
Daca operatorul pentru feliere este precizat fara valori, este returnata o noua lista care contine toate elementele listei initiale.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[:] ['Timisoara', 'Londra', 'Budapesta', 'New York']
Indecsii precizati la nivelul operatiei de feliere pot avea inclusiv valori negative, acestia pastrandu-si semnificatia de la accesarea elementelor unei liste prin intermedul unor indecsi negativi. Si in acest caz, evaluarea elementelor se va realiza incepand cu ultimul element din lista. Urmatorul exemplu returneaza o noua lista care contine ultimele trei elemente din lista orase.
>>> orase[-3:] ['Londra', 'Budapesta', 'New York']
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 listei in care elementele sunt precizate in ordine inversa.
>>> orase[::-1] ['New York', 'Budapesta', 'Londra', 'Timisoara'] >>> orase[::1] ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[::2] ['Timisoara', 'Budapesta'] >>> orase[::3] ['Timisoara', 'New York']
Inserarea de valori intr-o lista, la o anumita pozitie, se poate face si prin intermediul operatorului de feliere, daca este precizat un interval vid [1:1]. La pozitia 1 sunt inserate cele doua valori de la nivelul listei [‘Roma’, ‘Praga’].
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase[1:1] = ['Roma', 'Praga'] >>> orase ['Timisoara', 'Roma', 'Praga', 'Londra', 'Budapesta', 'New York']
Parcurgerea elementelor unei liste
Elementele de la nivelul unei structuri de date de tip lista pot fi parcurse prin intermediul unei iteratii for.
>>> for oras in ['Timisoara', 'Londra', 'Budapesta', 'New York']: ... print(oras) ... Timisoara Londra Budapesta New York
Metode predefinite pentru liste
Limbajul Python ofera metode predefinite ce pot fi referite de obiectele de tip lista. Acestea permit si adaugarea de elemente la o lista, stergerea anumitor elemente din lista sau ordonerea elementelor listei.
Metoda | Semnificatie |
---|---|
append() | adauga un element la finalul listei |
insert() | insereaza un element la pozitia specificata |
extend() | adauga la finalul listei elementele listei furnizate |
remove() | sterge prima aparitie a elementului specificat |
pop() | sterge elementul de la pozitia specificata si il returneaza |
copy() | returneaza o copie a listei |
clear() | sterge toate elementele din lista |
count() | numarul de aparitii al unui element in lista |
index() | indexul primului element din lista care detine valoarea specificata |
sort() | sorteaza elementele listei |
reverse() | inverseaza ordinea elementelor din lista |
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.sort() >>> orase ['Budapesta', 'Londra', 'New York', 'Timisoara']
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.reverse() >>> orase ['Timisoara', 'New York', 'Londra', 'Budapesta']
Metoda index() realizeaza identificarea unui element la nivelul unei liste si returneaza pozitia primei aparitii a elementului la nivelul listei. Daca elementul nu este prezent la nivelul listei este generata o exceptie de tipul ValueError.
>>> orase = ['Timisoara', 'Londra', 'Budapesta', 'New York'] >>> orase.index('Londra') 1 >>> orase.index('Sofia') Traceback (most recent call last): File "", line 1, in ValueError: 'Sofia' is not in list
Metoda count() returneaza numarul de aparitii al elementului precizat ca si argument la nivelul unei liste.
>>> orase.count('Budapesta') 1
Functii predefinite pentru liste
Structurile de date de tip lista beneficiaza de o serie de functii predefinite care permit, printre altele, determinarea numarului de elemente de la nivelul listei, a valorii maxime sau minime de la nivelul elementelor listei, a sumei elementelor listei.
Functie | Semnificatie |
---|---|
len() | numarul de elemente de la nivelul listei |
max() | valoarea maxima de la nivelul listei |
min() | valoarea minima de la nivelul listei |
sum() | suma valorilor elementelor de la nivelul listei |
sorted() | returneaza o noua lista ordonata crescator |
any() | True daca cel putin un element din lista are valoarea True |
all() | True daca toate elementele listei 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 noua lista care contine elementele listei 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 listei are valoarea True, sau daca toate elementele de la nivelul listei se evalueaza la True.
>>> any([0, False, 0.0, '']) False >>> all([0, 1, 2, 3, 4]) False
Python List Comprehension
Termenul list comprehension se refera la crearea unei liste noi dintr-o lista existenta pe baza unei expresii urmate de una sau mai multe instructiuni for si/sau if.
Daca se doreste crearea unei liste 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.append(oras) ... >>> print(orase_new) ['Amsterdam', 'Caransebes', 'Cluj-Napoca', 'Iasi']
Secventa de cod precedenta poate fi rescrisa folosind list comprehension, astfel:
>>> orase_new = [oras for oras in orase if oras[0] < 'M'] >>> print(orase_new) ['Amsterdam', 'Caransebes', 'Cluj-Napoca', 'Iasi']
>>> numere = [10, 4, 7, 5, 34, 6, 78] >>> numere_pare = [elem for elem in numere if elem%2 == 0] >>> numere_pare [10, 4, 34, 6, 78] >>> numere2 = [(elem, elem**2) for elem in numere if elem%2 == 0] >>> numere2 [(10, 100), (4, 16), (34, 1156), (6, 36), (78, 6084)]