Citat:
a1234567: Jesi ti siguran da se ovo može rešiti samo sa if... else?
Ocigledno ne, treba ti i petlja ... 'for' petlja. :-) Mislim, ako resavas opsti slucaj (dimenzija M x N).
Citat:
Ali mi nije baš jasno kako ću odrediti njegovo mesto. Jedino za svaki broj da bude promenljiva po nekom nizu, recimo
Zato sam ti i savetovao da prodjes onaj kurs sa MIT. Tamo lepo objasnjavaju strukture podataka, pocev od skalarnih tipova (str, int, float ...) do vektorskih (list, dict ...). Kada imas listu:
a = [ 10, 20, 50, 100, 200 ]
Elemente liste mozes da dobijes sa:
>>> a[0]
10
>>> a[2]
50
Prvi element liste s leve strane ima indeks 0, slede 1, 2 itd. Slicno tome, u matrici iz tvog primera (zaboravio si zareze na kraju vrsta).
brojevi = [[8, 29, 22, 17], [14, 38, 21, 18], [15, 52, 40, 39], [31, 20, 26, 41]]
vrednost pojedinih elemenata dobijas sa:
>>> brojevi[0][0]
8
>>> brojevi[0][1]
29
>>> brojevi[2][3]
39
U opstem slucaju
brojevi[x][y], gde je
x vrsta (0-3), a
y kolona (0-3). Znaci, za svaki element liste, odnosno 'liste lista' (matrice) mozes lako da dobijes indeks elementa.
Kako mozes da odstampas / analiziras elemente liste, jedan iza drugog? Koriscenjem 'for' petlje. Imas dva nacina - iterativno, element po element:
lista = [ 10, 11, 12, 13, 14]
for element in lista:
print element
Ili pristupajuci klasicno, indeks po indeks:
for id in range(len(lista)): # len(lista) = 5 u gornjem primeru:
print lista[id]
A sada nesto sto mozda nisi znao: za razliku od nekih drugih programskih jezika u Pythonu su liste dinamicke, implementirane kao ulancane liste s pointerima. Ako napravis praznu listu:
lista = []
Ona nece imati nijedan element, a ako pokusas da pristupis ili da direktno dodelis vrednost desetog elementa u listi, dobices:
>>> lista[9] = 12
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
Listu mozes da definises ili direktno (lista = [1, 3, 5, 7, 11]) ili metodom element po element, koriscenjem append() metode:
>>> lista.append(51234)
>>> lista.append(51)
>>> lista.append(3)
>>> lista
[51234, 51, 3]
>>> lista[1]
51
Elemente liste mozes i da brises (pop() / remove()), da umeces elemente usred postojece liste (insert()) itd. Osnovne operacije sa listama mozes da vidis
ovde
Medjutim, ponekad ti moze zatrebati prazna lista koja sadrzi svuda nule, a gde mozes proizvoljno da pristupis bilo kom elementu i dodelis mu vrednost. To je narocito pogodno kada prevodis prastare programe koje su neke fortrandzije pisale pre 40 godina, tamo su nizovi staticki definisani i automatski popunjeni nulama. Ili neki Perl skript, u Perlu su sve promenljive kada ih prvi put pozoves uvek nule (osim ako ne koristis 'use strict').
Praznu listu od 10 nula kreiras sa:
lista = [0]*10
>>> lista
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> lista[5]=111
>>> lista
[0, 0, 0, 0, 0, 111, 0, 0, 0, 0]
Slicno tome, matricu 3 x 3 popunjenu nulama mozes da dobijes sa:
>>> matrica = [[0, 0, 0]]*3
ili:
>>> matrica = [[0]*3]*3
U oba slucaja rezultat je isti:
>>> matrica
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Takozvanu jedinicnu matricu:
1 0 0
0 1 0
0 0 1
dobijas ovako:
Code:
e = [] # Kreira praznu listu
for i in range(3):
e.append([]) # Dodaje praznu vrstu matrice
for j in range(3):
if (i==j):
e[i].append(1)
else:
e[i].append(0)
U gornjem izrazu 'i==j' je izraz tipa boolean, ciji je rezultat True ili False. Boolean se moze konvertovati u integer funkcijom int() (int(False) = 0, int(True) = 1). Samim tim, ovo gore mozes da skratis:
Code:
e = [] # Kreira praznu listu
for i in range(3):
e.append([]) # Dodaje praznu vrstu matrice
for j in range(3):
e[i].append(int(i==j)) # Daje 0 ako je i!=j, a 1 ako je i==j
Moze li jos krace? Moze! U Pythonu imas lepu stvar koja se zove
comprehension, koja ti omogucava da gornji kod skratis na jednu liniju (verovatno si video ovaj trik u Pantinim kodovima, na linku koji sam ti dao imas vise o tome):
Code:
e = [ [ int(i==j) for i in range(3) ] for j in range (3) ]
Mislim da ti sada nece biti tesko da uradis zadatak.
[Ovu poruku je menjao B3R1 dana 17.01.2020. u 15:40 GMT+1]