Python 3. Списки
Свойства, индексация и срезы списков
Я уже писал про последовательности и множества в Python 3. Список — это изменяемая последовательность объектов, причём в одном списке можно хранить объекты разных типов.
Списки в Python 3 записываются в квадратных скобках, например так:
my_list = [1, 2, 3, 4, 'пять']
В коде выше мы создали список [1, 2, 3, 4, 'пять'] и связали его с переменной my_list. Как видите, наш список хранит и числа и строки. Но Python определяет тип объектов во время выполнения, а не при их объявлении в коде. Поэтому, если например, мы захотим из каждого элемента списка отнять 1, а там окажется строка, то ошибка появится во время выполнения, а не во время компиляции.
Список, так же как и строка индексирует свои элементы:

Индексация позволяет обращаться к объектам в списке по индексу (положительному или отрицательному), а также создавать срезы.
Получение некоторых свойств списка, обращение по индексам и создание срезов показана в этом примере:
### Код
my_list = [1, 2, 3, 4, 'пять']
print('Тип объекта - ', type(my_list)) # Тип объекта
print('Длина списка - ',len(my_list)) # Длина списка
print('Первый элемент списка - ', my_list[0]) # Обращение по индексу
print('Срез [1:4] - ', my_list[1:4]) # Срез от 2-ого элемента до 3-его
print('Срез [0:5:2] - ', my_list[0:5:2]) # Срез от 1-ого элемента до 5-ого, с шагом 2
### Исполнение
Тип объекта - <class 'list'>
Длина списка - 5
Первый элемент списка - 1
Срез [1:4] - [2, 3, 4]
Срез [0:5:2] - [1, 3, 'пять']
Запомните, когда вы создаёте срез, то указываете от какого элемента (включительно) и до какого элемента (не включительно). Вы можете указать шаг среза, например каждый второй элемент, или каждый третий, и так далее.
Так как список — это изменяемый тип данных, то мы можем изменить объект, не создавая новый, например так:
### Код
my_list = [1, 2, 3, 4, 'пять']
print(my_list, ' id =', id(my_list))
my_list[4] = 5
print(my_list, ' id =', id(my_list))
### Исполнение
[1, 2, 3, 4, 'пять'] id = 1906747850496
[1, 2, 3, 4, 5] id = 1906747850496
Из кода видно, что мы изменили список, при этом объект остался прежним.
Работа со списками в Python
Изменение элемента списка
Выше я уже показал, как можно изменить элемент списка, но повторюсь:
### Код
my_list = [1, 2, 3, 4, 'пять']
my_list[4] = 5
print(my_list)
### Исполнение
[1, 2, 3, 4, 5]
Добавление элемента в список
Мы можем добавить элемент в конец списка с помощью метода append. Или добавить элемент на определённую позицию с помощью метода insert (при этом элементы сдвигаются вправо):
### Код
my_list = [1, 2, 3, 4, 'пять']
my_list.append('шесть') # Добавили элемент в конец списка
print(my_list)
my_list.insert(1, "два") # Добавили элемент на 1-ое место
print(my_list)
### Исполнение
[1, 2, 3, 4, 'пять', 'шесть']
[1, 'два', 2, 3, 4, 'пять', 'шесть']
Расширение списка другим списком
Можно расширить список другим списком с помощью метода extend:
### Код
my_list1 = [1, 2, 3]
my_list2 = [4, 5, 6]
my_list1.extend(my_list2)
print(my_list1)
### Исполнение
[1, 2, 3, 4, 5, 6]
Удаление элемента из списка
Удалить элемент из списка можно по значению элемента с помощью метода remove. Или по его индексу с помощью метода pop.
### Код
my_list = [1, 2, 3, 4, 5, 6]
my_list.remove(6)
my_list.pop(0)
print(my_list)
### Исполнение
[2, 3, 4, 5]
Очистка списка
Также можно очистить массив полностью с помощью метода clear:
### Код
my_list = [1, 2, 3, 4, 5, 6]
my_list.clear()
print(my_list)
### Исполнение
[]
Сортировка списка
Отсортировать список с однотипными данными можно с помощью метода sort:
### Код
my_list = [1, 3, 2, 5, 4, 6]
my_list.sort()
print(my_list)
### Исполнение
[1, 2, 3, 4, 5, 6]
Сортировка списка кортежей
Более сложный вариант сортировки, это сортировка списка кортежей.
Если сортировать список кортежей с помощью метода sort() без дополнительных параметров, то сортировка будет происходить по первому элементу кортежей. Затем, если будет встречено 2 одинаковых первых элементов, то по вторым элементам, затем по третьем и так далее.
Для того чтобы отсортировать список не по первому элементу кортежа нужно воспользоваться функцией lambda, с помощью неё можно вести сортировку по заданному элементу кортежа.
Такая запись key=lambda i: i[1] - означает что сортировка будет по первому индексу в кортеже. Вы можете задать любой индекс. Кортежи должны быть однотипные.
my_list = [(23, 18, 53), (18, 51, 48), (27, 38, 24), (15, 12, 33)]
# Вывод без сортировки
print(my_list) # [(23, 18, 53), (18, 51, 48), (27, 38, 24), (15, 12, 33)]
# Сортировка по первому элементу
my_list.sort()
print(my_list) # [(15, 12, 33), (18, 51, 48), (23, 18, 53), (27, 38, 24)]
# Сортировка по второму элемемту
my_list.sort(key=lambda i: i[1])
print(my_list) # [(15, 12, 33), (23, 18, 53), (27, 38, 24), (18, 51, 48)]
# Сортировка по третьему элемемту
my_list.sort(key=lambda i: i[2])
print(my_list) # [(27, 38, 24), (15, 12, 33), (18, 51, 48), (23, 18, 53)]
Сколько раз элемент встречается в списке
Посчитать сколько раз элемент встречается в списке можно с помощью метода count:
### Код
my_list = [1, 3, 2, 5, 4, 6, 2, 1, 2, 1, 7,1]
print(my_list.count(2))
### Исполнение
3
Копирование списка
Так как список относится к изменяемым типам данным, то при присваивании существующего списка новой переменной, копирования не происходит. Новая переменная просто ссылается на старый список. Может случиться такая ситуация, мы думаем что изменяем новый список, а на самом деле изменяем и старый список тоже (потому что это один и тот же список):
### Код
my_list_1 = [1, 3, 5, 7]
my_list_2 = my_list_1
my_list_2.append(9)
print(my_list_1)
### Исполнение
[1, 3, 5, 7, 9]
Поэтому список нужно копировать с помощью метода copy:
### Код
my_list_1 = [1, 3, 5, 7]
my_list_2 = my_list_1.copy()
my_list_2.append(9)
print(my_list_1)
print(my_list_2)
### Исполнение
[1, 3, 5, 7]
[1, 3, 5, 7, 9]
Проверяем содержится ли элемент в списке
Проверить, содержится ли элемент в списке можно так:
### Код
my_list = [1, 3, 5, 7]
print (1 in my_list)
print (2 in my_list)
### Исполнение
True
False
Если понравилась статья, подпишись на мой канал в VK или Telegram .