Sunteți pe pagina 1din 9

#wit.

py Structuri de date Partea 1


24 Mai, 2012 la 7:071061 afisari
Etichete : indexare, indexing, liste, lists, longint, python, slicing, string, tablouri, tablouri unidimensionale, tuples

Cum mi-as putea face primul blog? Rezolvarea temei


Rezolvarea a fost scris de Luca George i este corect. Exercitiul 1: nume = raw_input("Nume : ") print "Salutare, " + nume + "." Exercitiul 2: a = raw_input('Introduceti numele ultimei carti citite: print ''Ultima data am citit \'' + a + '\'' Felicitri pentru rezolvare!

')

Structuri de date
Liste
Listele sunt prima structur de date despre care vom vorbi astzi. O list este defapt un tablou unidimensional ce poate conine orice alt tip de date, inclusiv: variabile de tip long (marcate cu un L la sfrit), stringuri (fr a le separa n caractere) i chiar i alte liste, aa cum putei vedea n acest exemplu. ion = ['Popescu Ion', 42] george = ['Frunzescu George', 51] database = [ion, george] Dup cum ai putut vedea, listele sunt marcate de paranteze ptrate, obiectele listei sunt delimitate de virgul, iar stringurile sunt scrise ntre ghilimele pentru a nu fi confundate cu o structur de date cu acel nume. Listele i stringurile suport indexarea, astfel, dac am avea: string = Salut, apelnd string[0] se va afia S. Acest lucru de poate folosi cu orice numr pn la 4 (stringul are 5 caractere, dar primul este 0). Dac ne-ar interesa ultima liter am folosi string[-1] (idem pentru -2, -3). Indexarea se mai poate face n dou cazuri, stringuri introduse direct, fr a se folosi o structur de date: >>> 'Salut'[1] 'a' i n timpul citirii: >>> nume = raw_input('Introduceti numele: ')[0] Introduceti numele: Bogdan >>> nume 'B' Not! Dup caracterele >>> v putei da seama c acest cod a fost preluat din interpretor. Rndurile precedate de aceste caractere sunt introduse de mine n interpretor, iar celelalte sunt afiate de acesta. Un exemplu pentru folosirea listelor este programul urmtor care citete o dat i o va afia n formatul: 24 mai 2012 # Afisarea datei, primind anul, luna, si ziua ca numere lunile = [ 'ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie',

'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie' ] an luna ziua = raw_input('Anul: ') = raw_input('Luna (1-12): ') = raw_input('Ziua (1-31): ')

luna_numeric = int(luna) ziua_numeric = int(ziua) # Nu uita sa scazi 1 din luna si ziua pentru a obtine indexul corect nume_luna = lunile[luna_numeric-1] print ziua + ' ' + nume_luna + ' ' + an raw_input()

Slicing
Aceast tehnic reprezint folosirea indexrii ntr-un interval. Pentru a nelege cum funcioneaz, avei exemplul urmtor: >>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> numbers[3:6] [4, 5, 6] >>> numbers[0:1] [1] Se poate folosi i aici mecheria cu numerele negative: >>>numbers[-3:-1] [8, 9] Dar dac vrem s folosim ultimele 2 caractere din aceast list, ce facem? >>> numbers[-2:0] [] Nu e rezultatul ateptat. Totui, de ce este returnat o list goal? Tot timpul cnd elementul reprezentat de termenul din stnga apare dup cel din dreapta (adic, penultimul element fa de primul) este returnat o list goal. Soluia problemei este >>> numbers[-2:] [9, 10] Acel spaiu gol de dup (sau de dinainte, dup caz) de : reprezint captul listei. Se poate folosi i astfel: >>> numbers[:3] [1, 2, 3] Defapt, pentru a afia ntreaga list se poate folosi i: >>> numbers[:] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Se poate specifica i un al treilea numr dup alte dou puncte, care reprezint saltul fcut n timpul parcurgerii >>> numbers[0:10:2] [1, 3, 5, 7, 9] Se poate specifica chiar i un numr negativ >>> numbers[10:0:-2] [10, 8, 6, 4, 2]

Adunare i multiplicare
Pe scurt, adunarea funcioneaz astfel: >>> [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] >>> 'Hello, ' + 'world!' 'Hello, world!' >>> [1, 2, 3] + 'world!' Traceback (innermost last): File "<pyshell#2>", line 1, in ?

[1, 2, 3] + 'world!' TypeError: can only concatenate list (not "string") to list iar multiplicarea va afia un string de un anumit numr de ori: >>> 'python' * 5 'pythonpythonpythonpythonpython' >>> [42] * 10 [42, 42, 42, 42, 42, 42, 42, 42, 42, 42]

Tuples
Ele sunt marcate de paranteze rotunde, iar diferena semnificativ dintre liste i tuples este c cele din urm NU pot fi modificate. Cteva exemple: >>> 1, 2, 3 (1, 2, 3) >>> (1, 2, 3) (1, 2, 3) >>> 42 42 >>> 42, (42,) >>> (42,) (42,) Aa cum ai observat, doar scriind mai multe numere, separate de virgul, vom obine un tuple, iar pentru a crea un tuple cu un singur element, acesta va trebui precedat de virgul.

Not de final
Articolul a ajuns destul de lung i am considerat c voi prezenta restul despre liste i tuples n articolul urmtor. *Am folosit exemple de cod din cartea Beginning Python: From Novice to Professional de Magnus Lie Hetland, ISBN: 159059519X *

Tem
De aceast dat nu voi da o tem, aceasta va fi publicat doar dup terminarea ntregii serii Structuri de date.

Vom continua subiectul dezbtut n articolul anterior, deoarece, att despre liste, ct i despre tuples mai sunt multe de spus. S ncepem cu un mic exemplu n care o propoziie citit de la tastatur va fi afiat 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 uor de neles, de aceea nu voi insista asupra lui i vom trece mai departe. Apartenena >>> 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 ai putut observa, prin intermediul in se verific apartenena unui string (sau list sau tuple) ntr-un alt string (sau list sau tuple).
Observaie: 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 cte ori apare.

Un exemplu pentru observaia de mai sus: >>> subiect = '!!! Important !!!' >>> '!!!' in subiect True Exemplul urmtor este un program ce conine o baz de date (defapt este o banal list) preconceput i verific dac combinaia user parol citit de la tastatur se afl n list. Am

fost nevoit s folosesc instruciunea if. Pentru a v-o explica pe scurt, pot spune c aceast instruciune verific dac declaraia imediat urmtoare (denumit i condiie) este adevrat i, n caz afirmativ, comanda de dup condiie 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 alctuit din nume i parol este prezent n lista denumit dbi dac da, se va afia Acceptat. Funcii utile Am folosit n primul exemplu de azi funcia len() , care returneaz lungimea unui string. Aceasta alturi demin() i max() pot fi foarte utile n utilizarea stringurilor. Exemplele de ma jos explic foarte bine utilizarea acestor funcii. >>> numbers = [100, 34, 678] >>> len(numbers) 3 >>> max(numbers) 678 >>> min(numbers) 34 >>> max(2, 3) 3 >>> min(9, 3, 2, 5) 2 Funcia 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). Totui, diferena nu trebuie s v preocupe.

Despre join voi spune mai multe ntr-un articol viitor. Operaii de baz cu listele V-am tot spus c o list poate fi modificat. Ei, a sosit timpul s vedei cum putei modifica o list, lucru care e destul de simplu. >>> a = [1, 2, 3] >>> a[1] = 5 >>> a [1, 5, 3] Atenie, nu se poate modifica o valoare care nu exist (n cazul de fa, nu a putea modifica a[5]). Pentru a terge i a aduga (la sfrit) elemente n list se folosete 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 pri 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 urmtorul exemplu, acest metod este folosit pentru a nlocui caractere de la captul listei (similar cudel, 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 cteva metode utile ar fi:


count numr de cte 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 asemntoare cu concatenarea, doar c aceasta modific lista iniial

>>> >>> >>> >>> [1,

a = [1, 2, 3] b = [4, 5, 6] a.extend(b) a 2, 3, 4, 5, 6]

index returneaz poziia primei apariii 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 poziia specificat

>>> >>> >>> [1,

numbers = [1, 2, 3, 5, 6, 7] numbers.insert(3, 'four') numbers 2, 3, 'four', 5, 6, 7]

pop elimin i returneaz un element de pe poziia specificat

>>> x = [1, 2, 3] >>> x.pop() 3 >>> x

[1, 2] >>> x.pop(0) 1 >>> x [2]


Observaie: Aceast metod alturi de count sunt singurele metode care returneaz o valoare. Restul returneaz None. remove elimin prima apariie a obiectului specificat

>>> x = ['to', 'be', 'or', 'not', 'to', 'be'] >>> x.remove('be') >>> x ['to', 'or', 'not', 'to', 'be']
reverse inverseaz lista

>>> >>> >>> [3,

x = [1, 2, 3] x.reverse() x 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 greit 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 uor de neles din exemple. V recomand s nu le tocii, ci, s le folosii ct mai des i astfel v vei obinui cu cele de care avei nevoie. Dac uitai cum s facei un lucru folosind o metod, nu e nicio problem. Putei s cutai pe Google, sau, de ce nu, s v folosii de acest articol. Voi termina aceast serie data viitoare, cnd 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 *

S-ar putea să vă placă și