Обробка і виведення вкладених списків. Часто в задачах доводиться зберігати прямокутні таблиці з даними. Такі таблиці називаються матрицями або двовимірними масивами.a = [[1, 2, 3], [4, 5, 6]]print(a[0])print(a[1])b = a[0]print(b)print(a[0][2])a[0][1] = 7print(a)print(b)b[2] = 9print(a[0])print(b)[1, 2, 3][4, 5, 6][1, 2, 3]3[[1, 7, 3], [4, 5, 6]][1, 7, 3][1, 7, 9][1, 7, 9]Тут перший рядок списку a [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.
Обробка і виведення вкладених списків. Для обробки і виведення списку, як правило, використовують два вкладених циклу. Перший цикл перебирає номер рядка, другий цикл біжить за елементами всередині рядка. Наприклад, вивести двовимірний числовий список на екран через підрядник, розділяючи числа пробілами всередині одного рядка, можна так: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()1 2 3 45 6 7 8 9
Введення двовимірного масиву. Нехай програма отримує на вхід двовимірний масив, у вигляді 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)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()1 2 3 4 5 67 8 9 Природно, для виведення одного рядка можна скористатися методом join ():for row in a: print(' '.join([str(elem) for elem in row]))
Обробка і виведення вкладених списків. Використовуємо два вкладених циклу для підрахунку суми всіх чисел в списку:a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]s = 0for i in range(len(a)): for j in range(len(a[i])): s += a[i][j]print(s)45 Або те ж саме з циклом не по індексу, а за значеннями рядків:a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]]s = 0for row in a: for elem in row: s += elem # s = s + elemprint(s)
Створення вкладених списків. Нехай дано два числа: кількість рядків n і кількість стовпців m. Необхідно створити список розміром n × m, заповнений нулями. Перший спосіб: спочатку створимо список з n елементів (для початку просто з n нулів). Потім зробимо кожен елемент списку посиланням на інший одновимірний список з m елементів:n = 3m = 4a = [0] * nfor i in range(n): a[i] = [0] * mprint(a)[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]Інший (але схожий) спосіб: створити порожній список, потім n раз додати в нього новий елемент, який є списком-рядком:n = 3m = 4a = []for i in range(n): a.append([0] * m)print(a)
Приклад 1: Створити матрицю A, що складається з N рядків і M стовпців і заповнити її випадковими числами з відрізка [20;80]. Нехай i і j - цілочисельні змінні, що позначають індекси рядка і стовпця.from random import randint. 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)[[77, 35, 55], [43, 46, 27], [43, 58, 63]] Оскільки людина сприймає матрицю як таблицю, краще і на екран виводити її у вигляді таблиці, для цього можна написати таку процедуру.def print. Matrix( 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 print. Matrix ( A ): for row in A: for x in row: print( "{:4}".format(x), end="" ) print( ) Перший цикл перебирає всі рядки в матриці; кожна з них по черзі потрапляє в змінну-масив row. Потім внутрішній цикл перебирає всі елементи цього масиву (рядки) і виводить їх на екран
Перебір елементів матриціКожен елемент матриці має два індекси, тому для перебору всіх елементів потрібно використовувати вкладений цикл. Зазвичай зовнішній цикл перебирає індекси рядків, а внутрішній - індекси стовпців. Ось так можна знайти суму всіх елементів матриці:summa = 0for i in range(N): for j in range(M): summa += A[i][j]print(summa)
Приклад: Дано цілочисельну матрицю випадкових цілих чисел розміром m*n (m і n задаються користувачем). Знайти мінімальний елемент матриці та його індекси. import randomn=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)for row in a: for elem in row: print(elem, end=' ') print()Введіть кількість рядків матриці: 4 Введіть кількість стовпців матриці: 4 Згенерована матриця:95 27 16 80 52 10 68 12 53 73 12 92 98 97 81 73
Спосіб 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): if a[i][j]==min_el: print('Індекс мінімального елемента[{}, {}]'.format(i,j)) Введіть кількість рядків матриці: 4 Введіть кількість стовпців матриці: 4 Згенерована матриця:81 79 14 91 54 67 17 72 62 81 66 61 42 77 59 79 Мінімальний елемент: 14Індекс мінімального елемента[0, 2]
Створити матрицю A, що складається з N рядків і M стовпців і заповнити його випадковими числами, знайти в ньому максимальний елемент і його індекси. Приклад 2:from random import randint. N=int(input("Введите N: "))M=int(input("Введите M: "))def print. A( A ): for row in A: for x in row: print( "{:4}".format(x), end=" " ) print()A = [ [0]*M for i in range(N) ]
Завдання для вирішення: Напишіть програму, яка повинна знайти максимальний і мінімальний елементи матриці розмірності N і M і поміняти їх місцями. 2. Напишіть програму, яка виводить на екран рядок матриці, сума елементів якої найбільша.3. Напишіть програму, яка виводить на екран стовпець матриці, сума елементів якого найменша.
Дана матриця дійсних чисел розміру m x n. Рядок, що містить максимальний елемент масиву, поміняти з рядком, що містить мінімальний елемент. Дана дійсна матриця розміру m x n. Знайти суму найбільших значень елементів її рядків.6. Подсчитать количество отрицательных элементов в каждой строке матрицы размером m х n, элементы которой задаются с помощью датчика случайных чисел. Завдання для вирішення:
Квадратні матриціКвадратна матриця - це двовимірний масив, у якого кількість рядків і кількість стовпціводнакові. Для квадратної матриці використовують поняття «головна діагональ» (сірі клітини на мал. 3, а) і «побічна діагональ» (мал. 3, б)Головна діагональ - це елементи A [0] [0], A [1] [1], ..., A [N-1] [N-1], тобто елементи, у яких номер рядка дорівнює номеру стовпчика. Для перебору цих елементів досить одного циклу:for i in range (N): # Працюємо з A [i][i]мал. 3
Побудувати квадратну матрицю розмірності N = 4, у якій елементи на головній діагоналі дорівнюватимуть одиниці, а інші елементи рівні нулю. Приклад 3. N=3def print. A( 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] = 0print. A( A )print()for i in range(N): A[i][i]=1print. A( A )
За допомогою генератора легко виділити елементи головної діагоналі в окремий масив: D = [A[i][i] for i in range (N)]A = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]D = [ A[i][i] for i in range(3)]print(D)Вивід:[1, 1, 1] Приклад 4. Елементи побічної діагоналі - це 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 print. A( 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)print. A( A )s=0for i in range(N): s +=A[i][N-1-i]print(s) Вивід програми: Введіть N: 4
Для обробки всіх елементів на головній діагоналі і під нею (Мал. 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 print. A( 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, 20)print. A( 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) Вивід програми: Введите N: 4
Щоб переставити стовпчики матриці, досить одного циклу. Наприклад, переставимо стовпці з індексами 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 = 5a = []for i in range(N): b = [] for j in range(M): b.append(round(random()*2)) a.append(b) print(b)c1 = int(input("Один столбец: ")) - 1c2 = int(input("Другой столбец: ")) - 1for i in range(N): a[i][c1], a[i][c2] = a[i][c2], a[i][c1] print(a[i])[2, 1, 2, 2, 1, 0, 2, 1, 0, 1][1, 1, 1, 1, 1, 1, 2, 2, 2, 1][1, 1, 0, 1, 1, 1, 2, 0, 0, 1][0, 0, 0, 2, 0, 0, 1, 2, 1, 2][1, 0, 0, 1, 2, 0, 2, 1, 1, 0]Один стовпчик : 3 Другій стовпчик: 10[2, 1, 1, 2, 1, 0, 2, 1, 0, 2][1, 1, 1, 1, 1, 1, 2, 2, 2, 1][1, 1, 1, 1, 1, 1, 2, 0, 0, 0][0, 0, 2, 2, 0, 0, 1, 2, 1, 0][1, 0, 0, 1, 2, 0, 2, 1, 1, 0]
Домашнє завдання2. Задана матрица неотрицательных чисел. Посчитать сумму элементов в каждом столбце. Определить, какой столбец содержит максимальную сумму.from random import random. M = 10 N = 5a = []for i in range(N): b = [] for j in range(M): b.append(int(random()*11)) print("%3d" % b[j], end='') a.append(b) print() for i in range(M): print(" --", end='')print()max_sum = 0col = 0for i in range(M): s = 0 for j in range(N): s += a[j][i] print("%3d" % s, end='') if s > max_sum: max_sum = s col = iprint()print(col+1)
Питання для самоконтролю. Що означають дужки []? Е змінна my_list ['a','b','c','d']. Яке значення виразу my_list[int('3' * 2)//11]?У змінній 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. Назвіть способи видалення значень із списку.