#wit.py – Structuri de date Partea 2
0Vom continua subiectul dezbătut în articolul anterior, deoarece, atât despre liste, cât şi despre tuples mai sunt multe de spus.
Să începem cu un mic exemplu în care o propoziţie citită de la tastatură va fi afişată într-un chenar, în centrul ferestrei.
# Prints a sentence in a centered "box" of correct width # Note that the integer division operator (//) only works in Pytho # 2.2 and newer. In earlier versions, simply use plain division (/ sentence = raw_input("Sentence: ") screen_width = 80 text_width = len(sentence) box_width = text_width + 6 left_margin = (screen_width - box_width) // 2 print print ' ' * left_margin + '+' + '-' * (box_width-2) + '+' print ' ' * left_margin + '| ' + ' ' * text_width + ' |' print ' ' * left_margin + '| ' + sentence + ' |' print ' ' * left_margin + '| ' + ' ' * text_width + ' |' print ' ' * left_margin + '+' + '-' * (box_width-2) + '+' print raw_input() #programul va astepta apasarea unei taste inainte de inchidere
Exemplul este destul de uşor de înţeles, de aceea nu voi insista asupra lui şi vom trece mai departe.
Apartenenţa
>>> permisiuni = 'ab' >>> 'a' in permisiuni True >>> 'w' in permisiuni False >>> utilizatori = ('Andrei', 'Cristi', 'Bogdan') >>> raw_input('nume: ') in utilizatori nume: Bogdan True >>> raw_input('nume: ') in utilizatori nume: Dinozaur False
După cum aţi putut observa, prin intermediul in se verifică apartenenţa unui string (sau listă sau tuple) într-un alt string (sau listă sau tuple).
Observaţie: valoarea returnată de in este de tip boolean, adică True sau False (respectiv 1 sau 0) şi va preciza doar dacă obiectul este prezent, nu şi de câte ori apare.
Un exemplu pentru observaţia de mai sus:
>>> subiect = '!!! Important !!!' >>> '!!!' in subiect True
Exemplul următor este un program ce conţine o „bază de date” (defapt este o banală listă) preconcepută şi verifică dacă combinaţia user – parolă citită de la tastatură se află în listă. Am fost nevoit să folosesc instrucţiunea if. Pentru a v-o explica pe scurt, pot spune că această instrucţiune verifică dacă declaraţia imediat următoare (denumită şi condiţie) este adevărată şi, în caz afirmativ, comanda de după condiţie va fi executată.
db = [ ['andrei', '1337'], ['bogdan', '8080'], ['raul', '2425'], ['ionut', '7331'] ] nume = raw_input('Nume: ') passw = raw_input('Parola: ') if [nume, passw] in db: print 'Acceptat'
În cazul de faţă, prin if se verifică dacă lista alcătuită din nume şi parolă este prezentă în lista denumită db şi dacă da, se va afişa Acceptat.
Funcţii utile
Am folosit în primul exemplu de azi funcţia len() , care returnează lungimea unui string. Aceasta alături de min() şi max() pot fi foarte utile în utilizarea stringurilor. Exemplele de ma jos explică foarte bine utilizarea acestor funcţii.
>>> numbers = [100, 34, 678] >>> len(numbers) 3 >>> max(numbers) 678 >>> min(numbers) 34 >>> max(2, 3) 3 >>> min(9, 3, 2, 5) 2
Funcţia list
Avantajul unei liste este că, spre deosebire de un string, poate fi manipulat. De aceea se poate dovedi util în unele cazuri să transformi un string în listă şi, eventual, invers.
>>> list('WorldIT') ['W', 'o', 'r', 'l', 'd', 'I', 'T'] >>> convert = list('WorldIT') >>> convert ['W', 'o', 'r', 'l', 'd', 'I', 'T'] >>> convert2 = ''.join(convert) >>> convert2 'WorldIT' >>> type(convert) <type 'list'> >>> type(convert2) <type 'str'>
Notă: list este defapt un tip de date (de unde şi type list de mai sus). Totuşi, diferenţa nu trebuie să vă preocupe.
Despre join voi spune mai multe într-un articol viitor.
Operaţii de bază cu listele
V-am tot spus că o listă poate fi modificată. Ei, a sosit timpul să vedeţi cum puteţi modifica o listă, lucru care e destul de simplu.
>>> a = [1, 2, 3] >>> a[1] = 5 >>> a [1, 5, 3]
Atenţie, nu se poate modifica o valoare care nu există (în cazul de faţă, nu aş putea modifica a[5]).
Pentru a şterge şi a adăuga (la sfârşit) elemente în listă se foloseşte del, respectiv append (care este o metodă – method):
>>> del a[2] >>> a [1, 5] >>> a.append(9) >>> a [1, 5, 9]
O altă metodă folosită pentru a modifica (de data aceasta părţi mai mari) dintr-o listă este aceea de a te folosi de slicing:
>>> name = list('Perl') >>> name[1:] = list('ython') >>> name ['P', 'y', 't', 'h', 'o', 'n']
În următorul exemplu, acestă metodă este folosită pentru a înlocui caractere de la capătul listei (similar cu del, iar în alte cazuri se poate folosi în locul lui append):
>>> numbers = [1, 5] >>> numbers[1:1] = [2, 3, 4] >>> numbers [1, 2, 3, 4, 5]
Methods
Alte câteva metode utile ar fi:
- count – numără de câte ori apare un obiect într-o listă
>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to') 2 >>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] >>> x.count(1) 2 >>> x.count([1, 2]) 1
- extend – asemănătoare cu concatenarea, doar că aceasta modifică lista iniţială
>>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> a.extend(b) >>> a [1, 2, 3, 4, 5, 6]
- index – returnează poziţia primei apariţii a unui element în listă
>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni'] >>> knights.index('who') 4 >>> knights.index('herring') Traceback (innermost last): File "<pyshell#76>", line 1, in ? knights.index('herring') ValueError: list.index(x): x not in list
- insert – inserează un element în listă, pe poziţia specificată
>>> numbers = [1, 2, 3, 5, 6, 7] >>> numbers.insert(3, 'four') >>> numbers [1, 2, 3, 'four', 5, 6, 7]
- pop – elimină şi returnează un element de pe poziţia specificată
>>> x = [1, 2, 3] >>> x.pop() 3 >>> x [1, 2] >>> x.pop(0) 1 >>> x [2]
Observaţie: Această metodă alături de count sunt singurele metode care returnează o valoare. Restul returnează None.
- remove – elimină prima apariţie a obiectului specificat
>>> x = ['to', 'be', 'or', 'not', 'to', 'be'] >>> x.remove('be') >>> x ['to', 'or', 'not', 'to', 'be']
- reverse – inversează lista
>>> x = [1, 2, 3] >>> x.reverse() >>> x [3, 2, 1]
- sort – sortează lista
>>> x = [4, 6, 2, 1, 7, 9] >>> x.sort() >>> x [1, 2, 4, 6, 7, 9]
sortare inversă:
>>> x = [4, 6, 2, 1, 7, 9] >>> x.sort(reverse=True) >>> x [9, 7, 6, 4, 2, 1]
atribuirea greşită după sortare:
>>> x = [4, 6, 2, 1, 7, 9] >>> y = x.sort() # sort returneaza None >>> print y None
atribuirea corectă după sortare:
>>> x = [4, 6, 2, 1, 7, 9] >>> y = x[:] >>> y.sort() >>> x [4, 6, 2, 1, 7, 9] >>> y [1, 2, 4, 6, 7, 9]
Încheiere
Nu am mai insistat asupra metodelor, deoarece consider că sunt uşor de înţeles din exemple. Vă recomand să nu le tociţi, ci, să le folosiţi cât mai des şi astfel vă veţi obişnui cu cele de care aveţi nevoie. Dacă uitaţi cum să faceţi un lucru folosind o metodă, nu e nicio problemă. Puteţi să căutaţi pe Google, sau, de ce nu, să vă folosiţi de acest articol. Voi termina această „serie” data viitoare, când vă voi prezenta mai multe despre tuples.
*Am folosit exemple de cod din cartea Beginning Python: From Novice to Professional de Magnus Lie Hetland, ISBN: 159059519X *
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!