## ++Тема 9++<br>Двумерные структуры данных (c) Яценко Р.Н., 2019-2020 --- ## 1. Вложенные списки ---- ### Двумерные массивы **Массивы**, положение элементов в которых описывается двумя номерами, называются **двумерными** Их можно представить в виде прямоугольной таблицы ---- ### Двумерные массивы как таблицы - В Python двумерный массив можно представить в виде списка строк, каждый элемент которого является в свою очередь списком, например, чисел | | | | |-|-|-| |1|2|3| |4|5|6| ---- ### Номера элементов | | | | |-|-|-| |`a[0][0]`|`a[0][1]`|`a[0][2]`| |`a[1][0]`|`a[1][1]`|`a[1][2]`| ---- ### Пример 1 Действия с элементами двумерного массива ```python= 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] = 7 print(a) print(b) b[2] = 9 print(a[0]) print(b) ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=a%20%3D%20%5B%5B1,%202,%203%5D,%20%5B4,%205,%206%5D%5D%0Aprint%28a%5B0%5D%29%0Aprint%28a%5B1%5D%29%0Ab%20%3D%20a%5B0%5D%0Aprint%28b%29%0Aprint%28a%5B0%5D%5B2%5D%29%0Aa%5B0%5D%5B1%5D%20%3D%207%0Aprint%28a%29%0Aprint%28b%29%0Ab%5B2%5D%20%3D%209%0Aprint%28a%5B0%5D%29%0Aprint%28b%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> ---- ### Пример 2 Вывод двумерного массива ```python= 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() ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=a%20%3D%20%5B%5B1,%202,%203,%204%5D,%20%5B5,%206%5D,%20%5B7,%208,%209%5D%5D%0Afor%20i%20in%20range%28len%28a%29%29%3A%0A%20%20%20%20for%20j%20in%20range%28len%28a%5Bi%5D%29%29%3A%0A%20%20%20%20%20%20%20%20print%28a%5Bi%5D%5Bj%5D,%20end%3D'%20'%29%0A%20%20%20%20print%28%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> ---- ### Пример 3 Сумма элементов двумерного массива ```python= 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) ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=a%20%3D%20%5B%5B1,%202,%203,%204%5D,%20%5B5,%206%5D,%20%5B7,%208,%209%5D%5D%0As%20%3D%200%0Afor%20i%20in%20range%28len%28a%29%29%3A%0A%20%20%20%20for%20j%20in%20range%28len%28a%5Bi%5D%29%29%3A%0A%20%20%20%20%20%20%20%20s%20%2B%3D%20a%5Bi%5D%5Bj%5D%0Aprint%28s%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> --- ## 2. Создание и ввод вложенных списков ---- ### Пример 4 Создание -- неправильное решение - Пусть даны два числа: количество строк `n` и количество столбцов `m` - Необходимо создать список размером `n`×`m`, заполненный нулями ```python= n = 3 m = 4 a = [[0] * m] * n a[0][0] = 5 print(a[1][0]) ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=n%20%3D%203%0Am%20%3D%204%0Aa%20%3D%20%5B%5B0%5D%20*%20m%5D%20*%20n%0Aa%5B0%5D%5B0%5D%20%3D%205%0Aprint%28a%5B1%5D%5B0%5D%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> ---- ### Пример 4 Создание -- правильное решение ```python= n = 3 m = 4 a = [0] * n for i in range(n): a[i] = [0] * m print(a) ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=n%20%3D%203%0Am%20%3D%204%0Aa%20%3D%20%5B0%5D%20*%20n%0Afor%20i%20in%20range%28n%29%3A%0A%20%20%20%20a%5Bi%5D%20%3D%20%5B0%5D%20*%20m%0Aprint%28a%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> ---- При помощи генератора ```python= n = 3 m = 4 a = [[0] * m for i in range(n)] print(a) ``` ---- ### Пример 5 Ввод двумерного массива - Пусть программа получает на вход двумерный массив в виде `n` строк, каждая из которых содержит `m` чисел, разделенных пробелами ```python= # в первой строке ввода идёт количество строк массива 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) ``` ---- При помощи генератора ```python= # в первой строке ввода идёт количество строк массива n = int(input()) a = [] for i in range(n): a.append([int(j) for j in input().split()]) ``` ---- При помощи двойного генератора ```python= # в первой строке ввода идёт количество строк массива n = int(input()) a = [[int(j) for j in input().split()] for i in range(n)] ``` --- ## 3. Примеры ---- ### Пример 6 - Дан двумерный массив - Возвести каждый элемент массива в квадрат ```python= from random import randint n = 2 m = 3 a = [[randint(1, 10) for j in range(m)] for i in range(n)] print(a) for i in range(n): for j in range(m): a[i][j] = a[i][j] ** 2 print(a) ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=from%20random%20import%20randint%0An%20%3D%202%0Am%20%3D%203%0Aa%20%3D%20%5B%5Brandint%281,%2010%29%20for%20j%20in%20range%28m%29%5D%20for%20i%20in%20range%28n%29%5D%0Aprint%28a%29%0Afor%20i%20in%20range%28n%29%3A%0A%20%20%20%20for%20j%20in%20range%28m%29%3A%0A%20%20%20%20%20%20%20%20a%5Bi%5D%5Bj%5D%20%3D%20a%5Bi%5D%5Bj%5D%20**%202%0Aprint%28a%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> ---- ### Пример 7 В двумерном массиве к элементам четных столбцов каждой строки прибавить элемент первого столбца этой строки ```python= from random import randint n = 2 m = 4 a = [[randint(1, 10) for j in range(m)] for i in range(n)] print(a) for i in range(n): for j in range(m): if j % 2 != 0: a[i][j] += a[i][0] print(a) ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=from%20random%20import%20randint%0An%20%3D%202%0Am%20%3D%204%0Aa%20%3D%20%5B%5Brandint%281,%2010%29%20for%20j%20in%20range%28m%29%5D%20for%20i%20in%20range%28n%29%5D%0Aprint%28a%29%0Afor%20i%20in%20range%28n%29%3A%0A%20%20%20%20for%20j%20in%20range%28m%29%3A%0A%20%20%20%20%20%20%20%20if%20j%20%25%202%20!%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20a%5Bi%5D%5Bj%5D%20%2B%3D%20a%5Bi%5D%5B0%5D%0Aprint%28a%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> ---- ### Пример 8 Определить, есть ли в массиве элемент, равный 0 ```python= from random import randint n = 2 m = 3 a = [[randint(0, 5) for j in range(m)] for i in range(n)] print(a) found = 0 for i in range(n): for j in range(m): if a[i][j] == 0: found = 1 if found: print('YES') else: print('NO') ``` ---- <iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=from%20random%20import%20randint%0An%20%3D%202%0Am%20%3D%203%0Aa%20%3D%20%5B%5Brandint%280,%205%29%20for%20j%20in%20range%28m%29%5D%20for%20i%20in%20range%28n%29%5D%0Aprint%28a%29%0Afound%20%3D%200%0Afor%20i%20in%20range%28n%29%3A%0A%20%20%20%20for%20j%20in%20range%28m%29%3A%0A%20%20%20%20%20%20%20%20if%20a%5Bi%5D%5Bj%5D%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20found%20%3D%201%0Aif%20found%3A%0A%20%20%20%20print%28'YES'%29%0Aelse%3A%0A%20%20%20%20print%28'NO'%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe> --- ## Спасибо за внимание! ![](https://i.imgur.com/gKDsna4.png) (c) Яценко Р.Н., 2019-2020
{"metaMigratedAt":"2023-06-15T16:03:33.992Z","metaMigratedFrom":"YAML","title":"Тема 9. Двумерные структуры данных","breaks":false,"slideOptions":"{\"allottedMinutes\":80,\"slideNumber\":\"c\",\"theme\":\"beige\",\"transition\":\"slide\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"93a8c43f-1b5b-4461-9101-89b183ccbc1c\",\"add\":9804,\"del\":1135}]"}
    647 views