2.5 Последовательности#
Первой группой типов данных, относящихся к коллекциям, мы назвали последовательности. Последовательности - это упорядоченные структуры данных, из которых можно получить элемент по индексу (что мы уже видели при работе со строками). К последовательностям можно отнести следующие типы данных:
Строка
strДиапазон
range- последовательность целых чисел в заданном диапазоне с заданным шагомСписок
list- неизменяемая последовательность объектов любых типовКортеж
tuple- неизменяемая последовательность объектов любых типов
Остановимся на каждом подробнее.
Бинарные последовательности
Также можно было выделить блок бинарных последовательностей: bytes, bytearray, memoryview. Однако в рамках курса они не рассматриваются.
Диапазоны#
Одна из наиболее простых последовательностей, которую мы часто будет встречать - диапазон. Это тип данных, представляющий из себя последовательность целых чисел и не обладающий каким-либо дополнительным функционалом. Основное его применение - ограничение количества итераций в счётных циклах, когда мы создаем последовательность из n целых чисел и потом выполняем n итераций по этой последовательности.
Создаётся диапазон с помощью вызова функции range, которой необходимо передать от одного до трех целочисленных параметров. Эти параметры определяют границы создаваемого диапазона и шаг между числами в нём:
При передаче одного параметра считается, что мы создаем последовательность от 0 включительно до указанного параметра не включительно с шагом 1
# Диапазон можно присвоить переменной и выполнять цикл уже по ней.
# Но чаще используется вариант, когда диапазон определяют сразу в цикле
for n in range(5): # цикл выполнит 5 итераций
print(n)
0
1
2
3
4
При передаче двух параметров считается, что мы создаем последовательность от первого параметра включительно до второго параметра не включительно с шагом 1.
# Помним, что все параметры при перечислении разделяются запятыми
for n in range(-2, 3):
print(n)
-2
-1
0
1
2
При передаче трёх параметров считается, что мы создаем последовательность от первого параметра включительно до второго параметра не включительно с шагом равным третьему параметру.
for n in range(-10, 11, 5):
print(n)
-10
-5
0
5
10
После определения диапазона с ним, как и с любой другой последовательностью, можно выполнить несколько действий.
Обратиться к элементу последовательности по индексу или получить её срез, как это уже делалось для строк
even_numbers = range(0, 100, 2)
print(even_numbers[5])
print(even_numbers[5:10])
10
range(10, 20, 2)
Получить длину последовательности, передав её как параметр в вызов функции
len
even_numbers = range(0, 100, 2)
len(even_numbers)
50
Проверить входит ли элемент в последовательность с помощью оператора
in(слева отinуказывается элемент, справа - последовательность, результат операции возвращает логический тип -True\False).
even_numbers = range(0, 100, 2)
10 in even_numbers
True
Кортежи#
Ещё одна простая последовательность, с которой мы часто будем работать, - это кортежи. Кортеж - неизменяемая последовательность, которая используется для хранения данных. Создается путем перечисления в круглых скобках через запятую элементов, которые в него должны войти:
number_tuple = (1, 2, 3, 4) # кортеж из чисел
str_sequence = ("1", "2", "3", "4") # кортеж из строк
mixed_sequence = (1, 2, "3", "4") # кортеж состоящий из разных типов данных
В отличие от диапазонов кортежи уже обладают минимальным встроенным функционалом и позволяют найти индекс нужного элемента в кортеже и посчитать, сколько таких элементов в данный кортеж входит.
number_tuple = (1, 2, 2, 3, 3, 3, 4, 4)
number_tuple.index(4) # возвращает индекс первого вхождения элемента в кортеж
# Если пробовать найти элемент, отсутствующий в кортеже, выполнение кода прекратится с ошибкой
6
number_tuple.count(4) # посчитает количество вхождений элемента в кортеж
# Если попробовать посчитать вхождения элемента, отсутствующего в кортеже, получим 0
2
Списки#
Когда последовательность нужно не просто хранить, а также изменять и дополнять в процессе, вместо кортежей будут использоваться списки. Создание списков похоже на создание кортежа с той разницей, что вместо круглых скобок используются квадратные:
number_sequence = [1, 2, 3, 4] # список из чисел
str_sequence = ["1", "2", "3", "4"] # список из строк
mixed_sequence = [1, 2, "3", "4"] # список, состоящий из разных типов данных
Для некоторых задач понадобится использовать ещё и пустые списки, которые будут заполняться в процессе. Создать пустой список можно двумя способами:
# 1. оставляем пустые скобки
empty_list = []
# 2. вызываем тип list
empty_list = list()
В плане функционала у списков есть множество методов, которые позволяют преобразовывать сам объект, в том числе добавляя в него новые элементы, убирая их или изменяя существующие.
Для добавления новых элементов в список обычно используются два метода: append и extend.
append- добавляет в конец списка один новый элемент. Всегда принимает только один параметр
my_list = []
my_list.append(1) # В качестве параметра указываем, какой элемент мы добавляем в последовательность
my_list.append([1, 2]) # Если попробовать добавить другой список, он также добавится как один элемент
print(my_list)
[1, [1, 2]]
extend- расширяет список, добавляя в конец списка элементы другой последовательности. В качестве параметра всегда принимает одну последовательность
my_list.extend([3, 4]) # 3 и 4 добавятся в список my_list как отдельные элементы
print(my_list)
[1, [1, 2], 3, 4]
Реже в случаях, когда элемент нужно добавить на конкретную позицию, используется метод insert. При вызове insert нужно всегда указывать два параметра: первый - по какому индексу будет вставлен элемент, второй - какой именно элемент будет вставлен.
my_list.insert(0, 5) # Вставит 5 на место с индексом 0, остальные элементы сдвинутся направо
print(my_list)
[5, 1, [1, 2], 3, 4]
Для удаления элемента могут использоваться два метода: remove и pop
remove по аналогии с index будет удалять из списка первое вхождение элемента в последовательность
my_list.remove(5) # Если попробовать удалить элемент, которого нет, то будет ошибка
print(my_list)
[1, [1, 2], 3, 4]
pop позволяет удалить элемент по индексу. Помимо простого удаления pop еще и возвращает удаленный элемент. Так, элемент можно будет достать из списка и сохранить в отдельную переменную.
my_list.pop(0)
print(my_list)
[[1, 2], 3, 4]
deleted_element = my_list.pop(0)
print("deleted:", deleted_element)
print("left:", my_list)
deleted: [1, 2]
left: [3, 4]
Последнее, что нам обязательно понадобится при работе со списками (с любыми изменяемыми последовательностями), - это изменение существующих значений. Мы уже умеем делать обращение по индексу, чтобы получить нужный элемент. Также обращение по индексу можно использовать при операциях присваивания, для изменения значения в последовательности по конкретному индексу.
number_sequence = [1, 2, 3, 4]
number_sequence[0] = 10
print(number_sequence)
[10, 2, 3, 4]
Множества#
В большинстве случаев нам будет достаточно использования диапазонов и списков. Но в случае, если понадобится отобрать уникальные элементы из последовательности, вместо написания своего алгоритма фильтрации более оптимальным подходом будет использование множества (еще одного типа данных, который мы отнесли к коллекциям). Множество создаётся путем перечисления в фигурных скобках через запятую элементов, которые в него должны войти.
number_set = {1, 2, 3, 4}
print(number_set)
{1, 2, 3, 4}
number_set = {1, 1, 1, 1} # При создании множества элементы могут повторяться
print(number_set) # После создания остаются только уникальные
{1}
Основное применение множеств будет в поиске уникальных значений для списков значений.
number_sequence = [1, 2, 3, 4, 4, 3, 2, 1] # При создании множества элементы могут повторяться
number_set = set(number_sequence)
print(number_set)
{1, 2, 3, 4}
Приведение типов
Если вызов list без параметров используется для создания пустого списка, то вызов list с параметром используется для приведения типа к списку.
Например:
numbers = list(range(5))
[0, 1, 2, 3, 4]
tuple и set ведут себя аналогично - вызов без параметров будет создавать пустой объект соответствующего типа, вызов с параметром будет работать как приведение типа.
Методы списков, кортежей, диапазонов
С полным перечнем методов списков и примерами их использования можно ознакомиться в справочном материале.
Методы множеств
С полным перечнем методов множеств и примерами их использования можно ознакомиться в справочном материале.