owned this note
owned this note
Published
Linked with GitHub
---
title: Тема 8. Списки и массивы
tags: Python Step
slideOptions:
allottedMinutes: 80
slideNumber: c
theme: beige
transition: slide
spotlight:
enabled: true
---
## ++Тема 8++<br>Списки и массивы
(c) Яценко Р.Н., 2019-2020
---
## 1. Списки
----
### Назначение списков
- Во многих задачах нужно сохранять всю обрабатываемую последовательность элементов в памяти, например, если бы нам требовалось отсортировать все элементы последовательности
- Для хранения таких данных можно использовать структуру данных, называемую в Python *список* (в большинстве языков программирования используется термин “массив”)
----
### Создание списка
- Список представляет собой последовательность элементов, пронумерованных от 0, как символы в строке
- Список можно задать перечислением элементов списка в квадратных скобках:
```python=
Primes = [2, 3, 5, 7, 11, 13]
print(Primes[0], Primes[1], Primes[2], Primes[3],
Primes[4], Primes[5])
print(Primes[-1], Primes[-6])
Rainbow = ['Red', 'Orange', 'Yellow', 'Green',
'Blue', 'Indigo', 'Violet']
print(Rainbow)
```
```
2 3 5 7 11 13
13 2
['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
```
----
### Длина списка
Длину списка, то есть количество элементов в нем, можно узнать при помощи функции `len`:
```python=
Rainbow = ['Red', 'Orange', 'Yellow', 'Green',
'Blue', 'Indigo', 'Violet']
print(Rainbow[0])
Rainbow[0] = 'красный'
print('Выведем радугу')
for i in range(len(Rainbow)):
print(Rainbow[i])
```
```
Red
Выведем радугу
красный
Orange
Yellow
Green
Blue
Indigo
Violet
```
----
### Пример 1
Считывание списка с известным количеством элементов. Исходные данные:
```
5
1809
1854
1860
1891
1925
```
```python=
a = [] # заводим пустой список
n = int(input()) # считываем количество элементов в списке
for i in range(n):
new_element = int(input()) # считываем очередной элемент
a.append(new_element) # добавляем его в список
print(a)
```
```
[1809, 1854, 1860, 1891, 1925]
```
----
### Пример 1
Сокращенная версия
```
5
1809
1854
1860
1891
1925
```
```python=
a = []
for i in range(int(input())):
a.append(int(input()))
print(a)
```
```
[1809, 1854, 1860, 1891, 1925]
```
----
### Операции над списками
- сложение списков, т. е. соединение списков
- повторение списков (умножение списка на число)
```python=
a = [1, 2, 3]
b = [4, 5]
c = a + b
print(c)
d = b * 3
print(d)
print([7, 8] + [9])
print([0, 1] * 3)
```
```
[1, 2, 3, 4, 5]
[4, 5, 4, 5, 4, 5]
[7, 8, 9]
[0, 1, 0, 1, 0, 1]
```
----
### Пример 1
Версия с поэлементным изменением.
Исходные данные:
```
5
1809
1854
1860
1891
1925
```
```python=
a = [0] * int(input())
for i in range(len(a)):
a[i] = int(input())
print(a)
```
```
[1809, 1854, 1860, 1891, 1925]
```
----
### Пример 2
Вывод списка
- В столбик:
```python=
a = [1, 2, 3, 4, 5]
for i in range(len(a)):
print(a[i])
```
```
1
2
3
4
5
```
----
- В строку:
```python=
a = [1, 2, 3, 4, 5]
for elem in a:
print(elem, end=' ')
```
```
1 2 3 4 5
```
---
## 2. Методы split и join
----
### Метод split (разделение)
- Элементы списка можно целиком считать функцией `input()` как строку
- После этого можно использовать метод строки `split()`, возвращающий список строк, которые получатся, если исходную строку разрезать на части по пробелам:
```python=
s = input() # s == '1 2 3'
a = s.split() # a == ['1', '2', '3']
print(a)
```
```
['1', '2', '3']
```
----
### Пример 3
Считывание списка с неизвестным количеством элементов в строку.
Исходные данные:
```
1809 1854 1860 1891 1925
```
```python=
a = input().split()
for i in range(len(a)):
a[i] = int(a[i])
print(a)
```
```
[1809, 1854, 1860, 1891, 1925]
```
----
### Разделитель для метода split
У метода `split()` есть необязательный параметр, который определяет, какая строка будет использоваться в качестве разделителя между элементами списка:
```python=
a = '192.168.0.1'.split('.')
print(a)
```
```
['192', '168', '0', '1']
```
----
### Метод join (соединение)
Метод `join` возвращает строку, полученную соединением элементов переданного списка в одну строку, при этом между элементами списка вставляется разделитель, равный той строке, к которой применяется метод:
```python=
a = ['red', 'green', 'blue']
print(' '.join(a))
print(''.join(a))
print('***'.join(a))
```
```
red green blue
redgreenblue
red***green***blue
```
---
## 3. Операции со списками
----
### Срезы
- `A[i:j]` срез из `j-i` элементов `A[i], A[i+1], ..., A[j-1]`
- `A[i:j:-1]` срез из `i-j` элементов `A[i], A[i-1], ..., A[j+1]` (то есть меняется порядок элементов)
- `A[i:j:k]` срез с шагом `k`: `A[i], A[i+k], A[i+2*k]`,... . Если значение `k<0`, то элементы идут в противоположном порядке.
Каждое из чисел `i` или `j` может отсутствовать, что означает “начало списка” или “конец списка”
----
### Пример 4
Срезы
```python=
a = [10, 20, 30, 40, 50, 60]
print(a[1:4])
print(a[4::-1])
print(a[:4:2])
print(a[::3])
s = 'abcdef'
print(s[1:4])
print(s[1:])
print(s[:4])
```
```
[20, 30, 40]
[50, 40, 30, 20, 10]
[10, 30]
[10, 40]
bcd
bcdef
abcd
```
----
### Пример 5
Изменение срезов
```python=
A = [1, 2, 3, 4, 5]
A[2:4] = [7, 8, 9]
print(A)
A = [1, 2, 3, 4, 5, 6, 7]
A[::2] = [10, 20, 30, 40]
print(A)
A = [1, 2, 3, 4, 5, 6, 7]
A[::-2] = [10, 20, 30, 40]
print(A)
```
```
[1, 2, 7, 8, 9, 5]
[10, 2, 20, 4, 30, 6, 40]
[40, 2, 30, 4, 20, 6, 10]
```
----
### Другие операции
| | |
|-|----|
|`x in A`|Проверить, содержится ли элемент в списке (`True/False`)|
|`x not in A`|То же самое, что `not(x in A)`|
|`min(A)`|Наименьший элемент списка|
|`max(A)`|Наибольший элемент списка|
|`A.index(x)`|Индекс первого вхождения элемента x в список|
|`A.count(x)`|Количество вхождений элемента x в список|
---
## 4. Генераторы списков
----
### Синтаксис генератора
_Генераторы_ -- это выражения, позволяющие заполнить список по формуле:
```python
[выражение for переменная in последовательность]
```
- _переменная_ -- идентификатор переменной
- _последовательность_ -- последовательность значений, что принимает переменная (список, строка или объект, полученный при помощи функции `range`)
- _выражение_ -- некоторое выражение, которым будут заполнены элементы списка, зависящее от переменной
----
### Пример 6
Создание списков при помощи генераторов
```python=
a = [0 for i in range(5)]
print(a)
n = 5
a = [i ** 2 for i in range(n)]
print(a)
n = 5
a = [i ** 2 for i in range(1, n + 1)]
print(a)
```
```
[0, 0, 0, 0, 0]
[0, 1, 4, 9, 16]
[1, 4, 9, 16, 25]
```
----
#### Пример 7
Создание списка из случайных чисел
```python=
from random import randrange
n = 10
a = [randrange(1, 10) for i in range(n)]
print(a)
```
```
[4, 9, 5, 8, 9, 9, 2, 8, 6, 3]
```
----
### Пример 8
Считывание списков при помощи генераторов
- Неизвестное количество элементов:
```
1809 1854 1860 1891 1925
```
```python=
a = [int(s) for s in input().split()]
print(a)
```
```
[1809, 1854, 1860, 1891, 1925]
```
----
- Заданное количество элементов:
```
5
1809 1854 1860 1891 1925
```
```python=
a = [int(input()) for i in range(int(input()))]
print(a)
```
```
[1809, 1854, 1860, 1891, 1925]
```
----
### Пример 9
Вывод списка чисел при помощи генератора
```python=
a = [1, 2, 3]
print(' '.join([str(i) for i in a]))
```
```
1 2 3
```
---
## Спасибо за внимание!

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