Python: Екі өлшемді массив
Сынып журналын елестет: әр оқушының әр пән бойынша бағасы бар — бұл бір тізім емес, КЕСТЕ. Шахмат тақтасы, Excel кестесі, көбейту кестесі — бәрі де жол мен бағаннан тұрады. Мұндай деректі бір өлшемді тізіммен сақтау қолайсыз. Осы сабақта тізімдер тізімін — екі өлшемді массивті (матрицаны) — құруды және өңдеуді үйренеміз. Бұл тақырып 8-сыныпта өтілмеген, бірақ ҰБТ-да толық тарау ретінде кездеседі.
Матрица (екі өлшемді массив) — m жол мен n бағаннан тұратын тіктөртбұрышты кесте. Программалауда әрбір элемент жол мен баған нөмірінің қиылысында анықталады.
Python-да классикалық (басқа тілдердегідей қатаң) көпөлшемді массив жоқ. Оның орнына тізімдер тізімі (list of lists) қолданылады — тізімнің әр элементінің өзі тізім болады.
arr = [[11, 22, 33], [44, 55, 66]]
Бұл — 2 жолдан, 3 бағаннан тұратын массив. arr[0] — бірінші жол ([11, 22, 33]), arr[1][2] — екінші жол, үшінші баған қиылысы (66).
N×N өлшемді, барлық элементі нөлге тең массив жасаудың ыңғайлы тәсілі — кіріктірілген тізім генераторы:
from random import randint N = int(input()) a = [[0 for j in range(N)] for i in range(N)] for i in range(0, N): for j in range(0, N): a[i][j] = randint(1, 9)
a = [[0]*N]*N деп жазуға болмайды! Бұл N рет БІР ҒАНА тізімге сілтеме жасайды — бір жолды өзгертсең, барлық жол өзгереді. Дұрысы — жоғарыдағы генератор тәсілі, ол әр жолға жеке тізім жасайды.# 1-тәсіл: индекс бойынша for i in range(len(arr)): for j in range(len(arr[i])): print(arr[i][j], end=' ') print() # 2-тәсіл: мән бойынша for row in arr: for elem in row: print(elem, end=' ') print()
Екі тәсіл де матрицаны толық аралайды және бірдей нәтиже береді. Индекс бойынша тәсіл — диагональ, орын ауыстыру секілді индекске тікелей тәуелді есептерге қолайлы; мән бойынша тәсіл — тек элементтерді оқу/қосынды табу секілді жағдайларда қысқарақ.
Бас диагональ:
i == j шартын қанағаттандыратын элементтер (солдан оңға төмен қарай). Жанама диагональ: i + j == N-1 шартын қанағаттандыратын элементтер (оңнан солға төмен қарай), N×N массивте, 0-индекстен санағанда.
| j=0 | j=1 | j=2 | j=3 | |
|---|---|---|---|---|
| i=0 | ● | · | · | ○ |
| i=1 | · | ● | ○ | · |
| i=2 | · | ○ | ● | · |
| i=3 | ○ | · | · | ● |
● — бас диагональ (i==j), ○ — жанама диагональ (i+j==N-1, мұнда N=4 болғандықтан i+j==3).
S = 0 for i in range(N): for j in range(N): if i == j: S += a[i][j] # бас диагональ қосындысы
- Екі өлшемді массив — тізімдер тізімі:
arr = [[11,22],[33,44]]. - Элементке қатынау:
arr[i][j](i — жол, j — баған). - Толтыру:
[[0 for j in range(N)] for i in range(N)]— әр жолға жеке тізім. - Аралау: индекс бойынша (
for i, for j) немесе мән бойынша (for row, for elem). - Бас диагональ: i==j; жанама диагональ: i+j==N-1.