§9 Двумерные и многомерные списки

В списке может быть использовано несколько индексов. Список с одним индексом называют одномерными, с двумя — двумерными и т. д. Одномерный список нестрого соответствует вектору в математике, двумерный — матрице. Чаще всего применяются списки с одним или двумя индексами, реже — с тремя, ещё большее количество индексов встречается крайне редко.
Для того, чтобы создать многомерный список можно воспользоваться генератором:
Программа 7.1

L = [[0] * 3 for i in range(4)]
print(L)
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

В этой программе создается двумерный список с размерностью 4х3, заполненный нулями. Для того, чтобы вывести подобный список в компактной форме используется представление в виде матрицы – прямоугольной таблицы. Матрица имеет вид:

L00 L01 L02 L03 L04 L05 ... L0j
L10 L11 L12 L13 L14 L15 ... L1j
L20 L21 L22 L23 L24 L25 ... L2j
L30 L31 L32 L33 L34 L35 ... L3j
L40 L41 L42 L43 L44 L45 ... L4j
L50 L51 L52 L53 L54 L55 ... L5j
... ... ... ... ... ... ...
Li0 Li1 Li2 Li3 Li4 Li5 ... Lij
  1. Матрица, в которой число строк равно числу столбцов называется квадратной матрицей
  2. Для обращения к элементу матрицы, необходимо использовать два индекса обозначающие номер строки и номер столбца. Например L[4][5]. В данном случае элемент списка L находится в пятой строке и шестом столбце.
  3. Чтобы вывести матрицу используется структура вложенных циклов for и переменные с именами: i – для пересчета строк (вложенных списков) и j – для пересчета столбцов (элементов вложенных списков).
  4. Если номер строки элемента совпадает с номером столбца (i = j), это означает, что элемент лежит на главной диагонали матрицы.
  5. Если элемент лежит на побочной диагонали, то индексы связаны с числом элементов в строке или столбце (n) следующим равенством: i + j = n - 1.
  6. Элементы находящиеся выше главной диагонали подчиняются правилу: i < j, а ниже i > j
  7. Элементы находящиеся выше побочной диагонали подчиняются правилу i + j < n, а находящиеся ниже i + j > n

Создать массив 10х10. Заполнить нулями и вывести
Программа 7.2

L = [[0] * 10 for i in range(10)]
for i in range(10):
    for j in range(10):
        print(L[i][j], "", end="")
    print()
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0

Разумеется, двумерный список можно инициализировать явно. В следующей программе создается массив 3х3 и выводятся его элементы в виде матрицы. Для вывода используется разновидность цикла for с перебором самих элементов.
Программа 7.3

L = [[2,3,4],[4,3,7],[8,3,5]]
for row in L:
    for item in row:
        print(item, "", end="")
    print()
2 3 4
4 3 7
8 3 5

Довольно часто, при решения некоторых задач, требуется быстро получить произвольную матрицу.
Заполнить двумерный массив размера 7х7 случайными числами и вывести его элементы.
Программа 7.4

from random import randint
L = [[0] * 7 for i in range(7)]
for i in range(7):
    for j in range(7):
        L[i][j] = randint(10,99)
        print("{:<3d}".format(L[i][j]), end="")
    print()
89 52 93 10 88 93 53 
37 73 18 39 76 13 57 
72 76 95 21 57 36 70 
26 81 59 79 60 48 61 
74 46 19 40 40 54 51 
76 43 79 67 99 34 35 
62 55 50 73 75 95 28

Данная задача может быть решена более компактно, если использовать генераторы. В этом случае, генераторы также должны быть вложены друг в друга
Программа 7.5

from random import randint
L = [[randint(10,99) for j in range(7)] for i in range(7)]
for i in range(7):
    for j in range(7):
        print("{:3d}".format(L[i][j]), end="")
    print()

Задача 1. Создать и вывести двумерный массив содержащий таблицу Пифагора (умножения)

L = [[i * j for j in range(1,10)] for i in range(1,10)]
for i in range(9):
	for j in range(9):
		print("{:3d}".format(L[i][j]), end="")
	print()
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81

Задача 2. Сформировать и заполнить матрицу по образцу:

1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 0 
1 1 1 1 1 1 1 0 0 
1 1 1 1 1 1 0 0 0 
1 1 1 1 1 0 0 0 0 
1 1 1 1 0 0 0 0 0 
1 1 1 0 0 0 0 0 0 
1 1 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 
L = [[0] * 10 for i in range(10)]
for i in range(9):
	for j in range(9 - i):
		L[i][j] = 1
for i in range(9):
	for j in range(9):
		print(L[i][j], "", end="")
	print()

Эту задачу можно было решить с использованием условной инструкции:

L = [[0] * 10 for i in range(10)]
for i in range(9):
	for j in range(9):
		if i + j < 9:
			L[i][j] = 1
		print(L[i][j], "", end="")
	print()

Домашнее задание

  • Даны целые положительные числа M и N. Сформировать целочисленную матрицу размера M × N, у которой все элементы J-го столбца имеют значение 5·J (J = 1, ..., N).
  • Даны целые положительные числа M, N и список из N чисел. Сформировать матрицу размера M × N, у которой в каждой строке содержатся все числа из исходного списка (в том же порядке).


Print Friendly, PDF & Email

Comments are closed