В этой статье я разбираю списки в 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) my_list.clear() 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
Итог
Python 3 содержит очень много методов работы со списками, изучить их все вы можете в официальной документации. В этой статье я разобрал лишь некоторую часть из них.