owned this note
owned this note
Published
Linked with GitHub
---
title: Тема 9. Двумерные структуры данных
tags: Python Step
slideOptions:
allottedMinutes: 80
slideNumber: c
theme: beige
transition: slide
spotlight:
enabled: true
---
## ++Тема 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>
---
## Спасибо за внимание!

(c) Яценко Р.Н., 2019-2020