Python 3. Списки

В этой статье я разбираю списки в Python 3. Вы узнаете, какими свойствами обладают списки и как можно с ними работать.















Свойства, индексация и срезы списков




Я уже писал про последовательности и множества в Python 3. Список — это изменяемая последовательность объектов, причём в одном списке можно хранить объекты разных типов.




Списки в Python 3 записываются в квадратных скобках, например так:




my_list = [1, 2, 3, 4, 'пять']




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




Список, так же как и строка индексирует свои элементы:




Индексация списка в Python 3
Индексация списка в Python 3




Индексация позволяет обращаться к объектам в списке по индексу (положительному или отрицательному), а также создавать срезы.




Получение некоторых свойств списка, обращение по индексам и создание срезов показана в этом примере:




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



2023-03-01T12:03:34
Python