Python екі өлшемді массивтер



Дата28.02.2022
өлшемі24,37 Kb.
#26576

Python екі өлшемді массивтер


Жиі тапсырмаларда деректермен тікбұрышты кестелерді сақтау керек. Мұндай кестелер матрицалар немесе екі өлшемді массивтер деп аталады. Бағдарламалау тілінде Питон кестені жолдар тізімі ретінде ұсынуға болады, оның әрбір элементі өз кезегінде тізім болып табылады, мысалы, сандар. Мысалы, екі жол мен үш бағаннан сандық кестені жасауға болады:
A = [[1, 2, 3], [4, 5, 6]]

Мұнда тізімнің бірінші жолы [0] [1, 2, 3] сандардың тізімі болып табылады. Яғни A[0][0] == 1, мәні A[0][1] == 2, A[0][2] == 3, A[1][0] == 4, A[1][1] == 5, A[1][2] == 6.

Тізімді өңдеу және шығару үшін әдетте екі ішкі цикл қолданылады. Бірінші цикл жол нөмірі бойынша, екінші цикл жол ішіндегі элементтер бойынша. Мысалы, екі өлшемді сандық тізімді экранға әр жол сайын шығарып, бір жолдың ішіндегі Бос орындар санын бөлісе аласыз:

for i in range(len(A)):

for j in range(len(A[i]):

print(A[i][j], end=' ')

print()

Бірдей, бірақ циклдер индекс бойынша емес, тізімнің мәндері бойынша:

for row in A:

for elem in row:

print(elem, end=' ')

print()


Әрине, бір жолды шығару үшін join әдісін қолдануға болады

for row in A:

print(' '.join(list(map(str, row))))

Тізімдегі барлық сандардың сомасын есептеу үшін екі ішкі циклді қолданамыз:

S = 0

for i in range(len(A)):

for j in range(len(A[i])):

S += A[i][j]

Немесе циклмен бірдей индекс бойынша емес, жолдардың мәндері бойынша

S = 0


for row in A:

for elem in row:

S += elem

Ішкі тізімдерді жасау


Екі Сан берілсін: n жолдар саны және M бағандарының саны.
Айқын шешім дұрыс емес:
# Қате

A = [[0] * m] * n

A[0][0] элементіне 1 мәнін тағайындау, содан кейін басқа элементтің мәнін көрсету оңайA[1][0] — ол да 1-ге тең болады! Өйткені [0] * m сілтемесін m нөлге қайтарады. Бірақ осы элементтің келесі қайталануы бірдей тізімге сілтеме болатын N элементтердің тізімін жасайды (дәл сол сияқты B операциясын орындау = A тізімдер үшін жаңа тізімді жасамайды), сондықтан нәтиже тізімінің барлық жолдары бірдей жол болып табылады.

Осылайша, екі өлшемді тізімді бір жолды қайталау операциясы арқылы жасауға болмайды. Не істеу керек?


Бірінші әдіс: алдымен n элементтердің тізімін жасаңыз (тек n нөлдерден бастау үшін). Содан кейін тізімнің әрбір элементін m элементтерінен басқа бір өлшемді тізімге сілтеме жасайық:

A = [0] * n

for i in range(n):

A[i] = [0] * m

Басқа (бірақ ұқсас) әдіс: бос тізімді жасау, содан кейін n рет тізім-жол болып табылатын жаңа элементті қосу:

A = []


for i in range(n):

A.append([0] * m)

Бірақ генераторды пайдалану оңай: әрқайсысы m нөлден тұратын тізім болатын n элементтердің тізімін жасау:

A = [[0] * m for i in range(n)]

Бұл жағдайда әрбір элемент қалғандарына қарамастан жасалады (тізімнің келесі элементін толтыру үшін [0] * m тізімі қайта құрастырылады), сол тізімге сілтемелер көшірілмейді.

Екі өлшемді массивті енгізу


Бағдарлама екі өлшемді массивке кіруге мүмкіндік берсін, олардың әрқайсысы бос орындармен бөлінген m сандарды қамтитын N жолдар түрінде. Оларды қалай есептеуге болады? Мысалы, осылай:

A = []


for i in range(n):

A.append(list(map(int, input().split())))

Немесе күрделі ішкі опциялар қоңырауларын пайдаланбай:
A = []

for i in range(n):

row = input().split()

for i in range(len(row)):

row[i] = int(row[i])

A.append(row)

Генератордың көмегімен де жасауға болады

A = [list(map(int, input().split())) for i in range(n)]


Екі өлшемді массивті өңдеу мысалы


N жолдар мен N бағандарынан шаршы массив болсын. Сол жақ жоғарғы бұрышынан оң жақ төменгі бұрышқа өтетін басты диагональдағы элементтерге (яғни ij олар үшін A[i][j] элементтеріне) 1 мәнін беру қажет, басты диагональдан жоғары элементтерге – 0 мәні, басты диагоналдан төмен элементтерге – 2 мәні. Яғни мұндай массивті алу (N = 4 үшін мысал)

1 0 0 0


2 1 0 0

2 2 1 0


2 2 2 1

Бұл мәселені шешудің бірнеше жолдарын қарастырайық. Басты диагональдан жоғары элементтер – бұл элементтер A[i][j], олар үшін ij. осылайша, біз I және j мәндерін салыстыра аламыз және олар бойынша A[i][j] мәнін анықтай аламыз. Келесі алгоритм аламыз:


for i in range(n):

for j in range(n):

if i < j:

A[i][j] = 0

elif i > j:

A[i][j] = 2

else:

A[i][j] = 1

Бұл алгоритм жаман, өйткені әр элементті өңдеу үшін бір немесе екі if нұсқауларын орындайды. Егер алгоритмді қиындататын болсақ, біз шартты нұсқауларсыз жасай аламыз.

Алдымен біз негізгі диагоналді толтырамыз, ол үшін бір цикл қажет

for i in range(n):

A[i][i] = 1

Содан кейін 0 мәнімен барлық элементтерді басты диагональдан жоғары толтырамыз, ол үшін I нөмірі бар жолдардың әрқайсысында j=i+1,..., n-1 үшін A[i][j] элементтеріне мән беру қажет. Мұнда біз қосымша циклдар қажет:
for i in range(n):

for j in range(i + 1, n):



A[i][j] = 0

Достарыңызбен бөлісу:




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет