You are on page 1of 32

Мова програмування PYTHON

  Двовимірні масиви

Навчання заради успіху


Обробка і виведення вкладених списків
Часто в задачах доводиться зберігати прямокутні таблиці з даними. Такі таблиці називаються матрицями
або двовимірними масивами.

a = [[1, 2, 3], [4, 5, 6]] [1, 2, 3]


print(a[0]) [4, 5, 6]
print(a[1]) [1, 2, 3]
b = a[0]
print(b)
3
print(a[0][2]) [[1, 7, 3], [4, 5, 6]]
a[0][1] = 7 [1, 7, 3]
print(a) [1, 7, 9]
print(b) [1, 7, 9]
b[2] = 9
Тут перший рядок списку a [0] є списком з чисел [1, 2, 3].
print(a[0])
Тобто a[0][0] == 1, a[0][1] == 2, a[0][2] == 3,
print(b) a[1][0] == 4, a[1][1] == 5, a[1][2] == 6.
Обробка і виведення вкладених списків
Для обробки і виведення списку, як правило, використовують два вкладених циклу. Перший цикл перебирає
номер рядка, другий цикл біжить за елементами всередині рядка. Наприклад, вивести двовимірний числовий
список на екран через підрядник, розділяючи числа пробілами всередині одного рядка, можна так:

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]


for i in range(len(a)):
for j in range(len(a[i])):
print(a[i][j], end=‘ ‘)
print()

1234
56
789
Введення двовимірного масиву

Нехай програма отримує на вхід двовимірний масив, у вигляді n рядків, кожен з яких містить m
чисел, розділених пробілами.

n = int(input())
a = []
for i in range(n):
a.append([int(j) for j in input().split()])
print(a) Або, без використання складних вкладених викликів функцій:

n = int(input())
a = []
for i in range(n):
row = input().split()
for i in range(len(row)):

row[i] = int(row[i])
a.append(row)
Ви можете зробити те ж саме з генераторами:

n = int(input())
a = [[int(j) for j in input().split()] for i in range(n)]
print(a)
Обробка і виведення вкладених списків
Змінна циклу for в Python може перебирати не тільки діапазон, який створюється за допомогою
функції range(), але і взагалі перебирати будь-які елементи будь-якій послідовності.

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]


for row in a:
for elem in row:
print(elem, end=‘ ‘)
print()

Природно,
для виведення одного рядка можна скористатися методом join (): 1234
for row in a:
56
print(' '.join([str(elem) for elem in row])) 789
Обробка і виведення вкладених списків
Використовуємо два вкладених циклу для підрахунку суми всіх чисел в списку:

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]


s = 0
for i in range(len(a)):
for j in range(len(a[i])): Або те ж саме з циклом не по
s += a[i][j] індексу,
print(s) а за значеннями рядків:
a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]
s = 0
for row in a:
45 for elem in row:
s += elem # s = s + elem
print(s)
Створення вкладених списків
Нехай дано два числа: кількість рядків n і кількість стовпців m. Необхідно створити
список розміром n × m, заповнений нулями.
Перший спосіб: спочатку створимо список з n елементів (для початку просто з n нулів). Потім зробимо
кожен елемент списку посиланням на інший одновимірний список з m елементів:

Інший (але схожий) спосіб: створити порожній список,


n = 3 потім n раз додати в нього новий елемент, який є
списком-рядком:
m = 4
a = [0] * n n = 3
for i in range(n): m = 4
a[i] = [0] * m a = []
print(a) for i in range(n):
a.append([0] * m)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] print(a)
Приклад 1:
Створити матрицю A, що складається з N рядків і M стовпців і заповнити її випадковими числами з відрізка [20;80].
Нехай i і j - цілочисельні змінні, що позначають індекси рядка і стовпця.

from random import randint [[77, 35, 55], [43, 46, 27], [43, 58, 63]]
N=3
M=3 Оскільки людина сприймає
A = [ [0]*M for i in range(N) ] матрицю як таблицю, краще і на
for i in range(N): екран виводити її у вигляді таблиці,
for j in range(M):
для цього можна написати таку
A[i][j] = randint( 20, 80 )
print(A)
процедуру.

def printMatrix( A ):
for i in range(len(A)):
for j in range(len(A[i])):
print( "{:4d}".format(A[i][j]), end="" )
print()
Тут i - це номер рядка, а j - номер стовпця; len (A) - це число рядків в матриці,
а len (A [i]) - число елементів в рядку i (збігається з числом стовпців).
Можна написати таку функцію і в стилі Python :

def printMatrix ( A ):
for row in A:
for x in row:
print( "{:4}".format(x), end="" )
print( )

Перший цикл перебирає всі рядки в матриці; кожна з них по черзі


потрапляє в змінну-масив row.
Потім внутрішній цикл перебирає всі елементи цього масиву (рядки) і
виводить їх на екран
Перебір елементів матриці
Кожен елемент матриці має два індекси, тому для перебору всіх елементів потрібно використовувати
вкладений цикл. Зазвичай зовнішній цикл перебирає індекси рядків, а внутрішній - індекси стовпців.
Ось так можна знайти суму всіх елементів матриці:

summa = 0
for i in range(N):
for j in range(M):
summa += A[i][j]
print(summa)
Приклад: Дано цілочисельну матрицю випадкових цілих чисел розміром m*n (m і n задаються
користувачем). Знайти мінімальний елемент матриці та його індекси.

import random
n=int(input('Введіть кількість рядків матриці: '))
m=int(input('Введіть кількість стовпців матриці: '))
a=[]
for i in range(n):
b=[]
for j in range(m):
x=random.randint(10,99)
b.append(x)
a.append(b)
print('Згенерована матриця:',a) Введіть кількість рядків матриці: 4
Введіть кількість стовпців матриці: 4
for row in a:
Згенерована матриця:
for elem in row: 95 27 16 80
print(elem, end=' ') 52 10 68 12
print() 53 73 12 92
98 97 81 73
Знайти мінімальний елемент матриці та його індекси.

Спосіб 1. Розв’язування методом перебору

. . . . .
min_el=a[0][0]
min_i=0
min_j=0
Введіть кількість рядків матриці: 4
for i in range(n):
Введіть кількість стовпців матриці: 4
for j in range(m): Згенерована матриця:
if a[i][j]<min_el: 47 50 90 69
min_el=a[i][j] 76 24 31 74
min_i=i 33 82 73 41
13 49 45 62
min_j=j
Мінімальний елемент: 13
print('Мінімальний елемент: ',min_el) Індекс мінімального елемента[3, 0]
print('Індекс мінімального елемента
[{}, {}]'.format(min_i,min_j))
Спосіб 2. Розв’язування з використаням методів списків.

min_col=list(map(min, a))
min_el=min(min_col)
min_i=min_col.index(min(min_col))
min_j=a[min_i].index(min_el)
print('Мінімальний елемент: ',min_el)
print('Індекс мінімального елемента[{},
{}]'.format(min_i,min_j))
Введіть кількість рядків матриці: 4
Введіть кількість стовпців матриці: 4
Згенерована матриця:
35 28 93 15
95 59 78 60
59 10 72 68
63 54 11 35
Мінімальний елемент: 10
Індекс мінімального елемента[2,1]
Спосіб 3. Пошук індексів для всіх мінімумів

Якщо ж матриця буде містити декілька рівних елементів, які і будуть мінімальними, то запропоновані
способи не підходять

. . . . .
min_col=list(map(min, a))
min_el=min(min_col)
print('Мінімальний елемент:',min_el)
for i in range(n):
for j in range(m): Введіть кількість рядків матриці: 4
Введіть кількість стовпців матриці: 4
if a[i][j]==min_el: Згенерована матриця:
print('Індекс 81 79 14 91
54 67 17 72
мінімального 62 81 66 61
елемента[{}, 42 77 59 79
Мінімальний елемент: 14
{}]'.format(i,j)) Індекс мінімального елемента[0, 2]
Приклад 2:
Створити матрицю A, що складається з N рядків і M стовпців і
заповнити його випадковими числами, знайти в ньому максимальний
елемент і його індекси.

from random import randint


N=int(input("Введите N: "))
M=int(input("Введите M: "))
def printA( A ):
for row in A:
for x in row:
print( "{:4}".format(x), end=" " )
print()
A = [ [0]*M for i in range(N) ]
for i in range(N):
for j in range(M):
A[i][j] = randint(0, 20)
printA(A)
m=A[0][0]
im=0
jm=0
for i in range(N):
for j in range(M):
if A[i][j]>m:
m=A[i][j]
im=i
jm=j
print("max=",m, " i=",im, " j=",jm)
Завдання для вирішення:

1. Напишіть програму, яка повинна знайти максимальний і


мінімальний елементи матриці розмірності N і M і поміняти
їх місцями.

2. Напишіть програму, яка виводить на екран рядок матриці,


сума елементів якої найбільша.

3. Напишіть програму, яка виводить на екран стовпець


матриці, сума елементів якого найменша.
Завдання для вирішення:

4. Дана матриця дійсних чисел розміру m x n. Рядок, що


містить максимальний елемент масиву, поміняти з
рядком, що містить мінімальний елемент.

5. Дана дійсна матриця розміру m x n. Знайти суму


найбільших значень елементів її рядків.

6. Подсчитать количество отрицательных элементов в каждой


строке матрицы размером m х n, элементы которой
задаются с помощью датчика случайных чисел.
Квадратні матриці
Квадратна матриця - це двовимірний масив, у якого кількість рядків і кількість стовпціводнакові.Для квадратної
матриці використовують поняття «головна діагональ» (сірі клітини на мал. 3, а) і «побічна діагональ» (мал. 3, б)

мал. 3

Головна діагональ - це елементи A [0] [0], A [1] [1], ..., A [N-1] [N-1], тобто елементи, у яких номер рядка
дорівнює номеру стовпчика. Для перебору цих елементів досить одного циклу:
for i in range (N):
# Працюємо з A [i][i]
Приклад 3. Побудувати квадратну матрицю розмірності N = 4, у якій елементи на
головній діагоналі дорівнюватимуть одиниці, а інші елементи рівні нулю.
N=3
def printA( A ):
for i in range(N):
for j in range(N):
print( "{:2d}".format(A[i][j]), end=" " )
print()
A = [ [0]*N for i in range(N) ]
for i in range(N):
for j in range(N): Вивід програми:
A[i][j] = 0
printA( A )
print()
for i in range(N):
A[i][i]=1
printA( A )
За допомогою генератора легко виділити елементи головної діагоналі в
окремий масив: D = [A[i][i] for i in range (N)]
Приклад 4. A = [[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]
D = [ A[i][i] for i in range(3)]
print(D)

Вивід:
[1, 1, 1] Елементи побічної діагоналі - це
A[0][N-1], A[1][N-2],...,A[N-1][0].
Зауважимо, що сума номерів рядка і стовпця
для кожного елемента дорівнює N - 1, тому
отримуємо такий цикл перебору:
for i in range (N):
# Працюємо з A [i] [N-1-i]
Приклад 5. Заповнити двовимірний масив випадковими числами і знайти суму
елементів, що лежать на побічної діагоналі.
from random import randint
N=int(input("Введіть N: "))
def printA( A ):
for row in A:
for x in row:
print( "{:4}".format(x), end=" " )
print()
A = [ [0]*N for i in range(N) ]
for i in range(N): Вивід програми:
for j in range(N):
A[i][j] = randint(0, 10) Введіть N: 4
printA( A )
s=0
for i in range(N):
s +=A[i][N-1-i]
print(s)
Для обробки всіх елементів на головній діагоналі і під нею (Мал. 4) потрібен
вкладений цикл: номер рядка буде змінюватися від 0 до N - 1,
а номер стовпця для кожного рядка i - від 0 до i:
for i in range(N):
for j in range(i+1):
# работаем с A[i][j]

Мал. 4, Виділена головна діагональ і всі елементи під нею.


Заповнити двовимірний масив випадковими числами і знайти максимальний елемент серед всіх елементів, що лежать на головній діагоналі і під нею.
Приклад 6.

from random import randint


N=int(input("Введіть N: "))
def printA( A ):
for row in A:
for x in row:
print( "{:4}".format(x), end=" " )
print()
A = [ [0]*N for i in range(N) ] Вивід програми:
for i in range(N):
for j in range(N): Введите N: 4
A[i][j] = randint(0, 20)
printA( A )
max=A[0][0]
for i in range(N):
for j in range(i+1):
if A[i][j]>max:
max=A[i][j]
print('max=',max)
Щоб переставити стовпчики матриці, досить одного циклу.
Наприклад, переставимо стовпці з індексами 2 і 4, використовуючи
множинне присвоювання в Python:
for i in range(N):
A[i][2], A[i][4] = A[i][4], A[i][2]

Переставити два рядки можна взагалі без циклу, враховуючи, що A [i] -


це посилання на список елементів рядка i. Тому досить просто
переставити посилання.

Оператор:
A[0], A[3] = A[3], A[0]
переставляє рядки матриці з індексами 0 і 3.
Для того щоб створити копію рядка з індексом i, не можна робити так:
R = A [i] # це невірно!
тому що при цьому ми отримаємо нову посилання на існуючий рядок.
Замість цього потрібно створити копію в пам'яті за допомогою зрізу, що включає
всі елементи рядка:
R = A [i] [:]
Побудувати копію стовпчика з індексом j трохи складніше, так як матриця
розташована в пам'яті порядках. У цьому завданні зручно використовувати
генератор:
C = [row [j] for row in A]
У циклі перебираються всі рядки матриці A, вони по черзі потрапляють в змінну-
масив row.
Генератор вибирає з кожного рядка елемент з індексом j і складає список з цих
значень.
Завдання для розв'язання:

1. Напишіть програму, яка знаходить максимальний елемент на головній діагоналі квадратної матриці.

2. Напишіть програму, яка заповнює матрицю з N рядків і N стовпців нулями і одиницями так, що всі
елементи вище побічної діагоналі рівні нулю, а інші - одиниці.

3. Дана целочисленная квадратна матриця порядку n. Знайти номери рядків, все елементи якихнулі.

4. Дана целочисленная квадратна матриця порядку N. Знайти найбільше із значень


елементів,розташованих в заштрихованої частини матриці.

5. Дана целочисленная квадратна матриця порядку N. Знайти найбільше із значень


елементів, розташованих в заштрихованої частини матриці.

6. Дана целочисленная квадратна матриця порядку N. Знайти добуток значень елементів,


розташованих в заштрихованої частини матриці.

7. Побудувати квадратну матрицю порядку


n:
8. Побудувати квадратну матрицю порядку
n:
Домашнє завдання
1. В числовий матриці поміняти місцями два стовпці, т. е. все елементи одного стовпчика поставити на відповідні
їм позиції іншого, а елементи другого перемістити в перший.
from random import random
M = 10
N = 5
a = []
for i in range(N):
    b = [] [2, 1, 2, 2, 1, 0, 2, 1, 0, 1]
[1, 1, 1, 1, 1, 1, 2, 2, 2, 1]
    for j in range(M): [1, 1, 0, 1, 1, 1, 2, 0, 0, 1]
        b.append(round(random()*2)) [0, 0, 0, 2, 0, 0, 1, 2, 1, 2]
    a.append(b) [1, 0, 0, 1, 2, 0, 2, 1, 1, 0]
    print(b) Один стовпчик : 3
c1 = int(input("Один столбец: ")) - 1 Другій стовпчик: 10
[2, 1, 1, 2, 1, 0, 2, 1, 0, 2]
c2 = int(input("Другой столбец: ")) - 1
[1, 1, 1, 1, 1, 1, 2, 2, 2, 1]
for i in range(N): [1, 1, 1, 1, 1, 1, 2, 0, 0, 0]
    a[i][c1], a[i][c2] = a[i][c2], a[i][c1] [0, 0, 2, 2, 0, 0, 1, 2, 1, 0]
    print(a[i]) [1, 0, 0, 1, 2, 0, 2, 1, 1, 0]
Домашнє завдання
2. Задана матрица неотрицательных чисел. Посчитать сумму элементов в каждом столбце.
Определить, какой столбец содержит максимальную сумму.

from random import random max_sum = 0
M = 10 col = 0
N = 5 for i in range(M):
a = []     s = 0
for i in range(N):     for j in range(N):
    b = []         s += a[j][i]
    for j in range(M):     print("%3d" % s, end='')
        b.append(int(random()*11))     if s > max_sum:
        print("%3d" % b[j], end='')         max_sum = s
    a.append(b)         col = i
    print() print()
  print(col+1)
for i in range(M):
    print(" --", end='')
print()
Питання для самоконтролю

1. Що означають дужки []?
2. Е змінна my_list ['a','b','c','d'].Яке значення виразу my_list[int('3' * 2)//11]?
3. У змінній list_a міститься список ['a', 'b', 'c', 'd’].
Яке значення виразу list_a[-1]?
4.У змінній list_b міститься список ['a', 'b', 'c', 'd’].
Яке значення виразу list_b[:2]?
5.У змінній list_c міститься список [2, 4, 6, 8, 10].
Як присвоїти значення 'zero' в якості третього елемента даного списку?
6.В чому різниця між функціями append() та insert(), передбаченими для списків?
7. Назвіть способи видалення значень із списку.
Python - це маленький початок великих справ.

Дякуємо!
mahalaschool.com.ua

You might also like