2.5 Последовательности

2.5 Последовательности#

Первой группой типов данных, относящихся к коллекциям, мы назвали последовательности. Последовательности - это упорядоченные структуры данных, из которых можно получить элемент по индексу (что мы уже видели при работе со строками). К последовательностям можно отнести следующие типы данных:

  1. Строка str

  2. Диапазон range - последовательность целых чисел в заданном диапазоне с заданным шагом

  3. Список list - неизменяемая последовательность объектов любых типов

  4. Кортеж tuple - неизменяемая последовательность объектов любых типов

Остановимся на каждом подробнее.

Диапазоны#

Одна из наиболее простых последовательностей, которую мы часто будет встречать - диапазон. Это тип данных, представляющий из себя последовательность целых чисел и не обладающий каким-либо дополнительным функционалом. Основное его применение - ограничение количества итераций в счётных циклах, когда мы создаем последовательность из 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

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

  1. Обратиться к элементу последовательности по индексу или получить её срез, как это уже делалось для строк

even_numbers = range(0, 100, 2)

print(even_numbers[5])
print(even_numbers[5:10])
10
range(10, 20, 2)
  1. Получить длину последовательности, передав её как параметр в вызов функции len

even_numbers = range(0, 100, 2)

len(even_numbers)
50
  1. Проверить входит ли элемент в последовательность с помощью оператора 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 ведут себя аналогично - вызов без параметров будет создавать пустой объект соответствующего типа, вызов с параметром будет работать как приведение типа.

Методы списков, кортежей, диапазонов

С полным перечнем методов списков и примерами их использования можно ознакомиться в справочном материале.

Методы множеств

С полным перечнем методов множеств и примерами их использования можно ознакомиться в справочном материале.