# Python. Структуры данных: список, кортеж, множество, словарь
Перевод параграфа 3.6 Data Structures из книги Intermediate Python
Python содержит встроенные типы данных: списки, кортежи, словари.
# Списки
Чтобы создать список используйте квадратные скобки или функцию list() :
Список сохраняет порядок элементов с которым создаётся или в котором элементы добавляются. Списки являются последовательностями и поддерживают доступ к элементам по индексу, другие свойства последовательностей будут описаны в следующих главах.
Первый элемент списка находится под индексом 0, последний — на единицу меньше длины списка.
Метод append() добавляет элемент в список.
Метод insert() добавляет элемент в любое место списка.
Оператор + объединяет два и более списка.
# Кортежи
Кортеж тоже является последовательностью и создается элементами разделёнными запятыми:
При определении непустого кортежа скобки не обязательны, но они становятся обязательными когда кортеж является частью большего выражения. Пустой кортеж создаётся пустой парой скобок:
При определении кортежа с одним элементом запятая за ним обязательна.
Пропуск запятой означает что задано обычное значение, не кортеж.
Кортежи индексируются как списки, но неизменямы.
В тоже время, если элементом кортежа является изменяемые объект, такой как список, то он может быть изменен.
# Множества
# Словари
Основные операции словаря это сохранение значения по ключу и доступ к значению по ключу. Доступ к значению осуществляется через квадратные скобки:
Словари изменяемы: значения связанные с ключами могут менятся, добавлятся и удалятся.
Структуры данных Python не ограничиваются приведёнными в этом разделе. Например, модуль collections содержит очереди, деки и другие коллекции. В то же время структуры приведённые в этом разделе используются в большинстве приложений на Python.
Используйте функцию help с параметром в виде названия типа данных для детального изучения типа.
К какой стандартной структуре данных в python нельзя обращаться по индексу
Как и в любом языке программирования в Python существует несколько типов структур данных, это:
Списки
Это динамическая структура данных, которая может хранить объекты разнородных типов с произвольным доступом к элементам (на самом деле он последовательный, но мы можем получить доступ к любому элементу по его индексу). Индексация элементов списка начинается с нуля. Из операций над списками, на начальном этапе достаточно знать и уметь добавлять элементы в список и удалять их из него.
Создание объекта списка происходит так:
добавление и удаление элемента в/из списка происходит следующим образом:
Надо сказать, что все операции так называемые in place, то есть в результате ничего не возвращается и новый список не создается.
Пример «список четных чисел»
Создадим список, содержащий все четные числа от нуля до некоторого N
Массивы
Масивы в python подобны спискам, за исключением того, что хранят элементы одного и того же типа (basic type). Тип массив (array) реализован в пакете array, для его использования, сначала нужно его импортировать.
Конструктор массивов имеет формат:
На 64-битной машине размер элементов в байтах будет следующим
| Type code | C Type | Python type | Minimum size in bytes |
|---|---|---|---|
| ‘b’ | signed char | int | 1 |
| ‘B’ | unsigned char | int | 1 |
| ‘u’ | Py_UNICODE | Unicode character | 2 |
| ‘h’ | signed short | int | 2 |
| ‘H’ | unsigned short | int | 2 |
| ‘i’ | signed int | int | 4 |
| ‘I’ | unsigned int | int | 4 |
| ‘l’ | signed long | int | 8 |
| ‘L’ | unsigned long | int | 8 |
| ‘q’ | signed long long | int | 8 |
| ‘Q’ | unsigned long long | int | 8 |
| ‘f’ | float | float | 4 |
| ‘d’ | double | float | 8 |
Массивы поддерживают те же операции, что и списки
Кортежи
Кортежем или tuple называется неизменяемый список. Создается он следующим образом:
Здесь стоит отметить, что в отличие от списка, где новый элемент просто добавляется в конец, происходит создание нового объекта.
Для кортежей доступ к элементу и выполнение срезов эквивалентно спискам, отсутствует лишь возможность изменять кортеж.
Для проверки наличия элемента в кортеже все аналогично спискам.
Словари
Создать ассоциативный массив просто:
Из этих примеров видно, что индекс может быть действительно любым объектом, равно как и присваиваемое значение.
Важно
При добавлении элементов в список, кортеж или словарь имейте ввиду, для atomic (immutable) и basic типов, создается ссылка на новый объект и помещается в словарь, для остальных объектов в словарь помещается ссылка на существующий объект. Если он в дальнейшем изменяется, то изменяется и содержимое словаря, кортежа, списка.
Как видите, изменение ссылочного объекта вне словаря/списка/кортежа ведет к изменению его в словаре/списке/кортеже
Множества
Это динамическая структура, содержащая уникальные значения. Множество может содержать лишь hashable объекты. Определяется так:
Поддерживает все операции над множествами: включение, исключение, пересечение, объединение.
Множества чрезвычайно полезны, если нам нужно получить количество различающихся элементов или вычислить спектр значений дискретной переменной.
Или в задачах где заведомо требуется уникальность каждого элемента в списке.
С помощью множества (точнее преобразования списка во множество) можно удалить дубликаты из исходной последовательности:
#2 Python для Data Science — Структуры данных
В предыдущей статье речь шла о переменных в Python. Теперь нужно обсудить вторую важную тему, без которой невозможно работать с этим языком в Data Science — структуры данных в Python.
Это практическое руководство!
Желательно повторять те части, где нужно писать код, и решать задачи в конце статьи! Также рекомендуется вернуться к прошлым материалам, если вы еще не ознакомились с ними.
Почему структуры данных в Python так важны?
Представьте книгу. Пусть это будет «Практическая статистика для специалистов Data Science» П. Брюса и Э. Брюса. Сохранить эту информацию можно, поместив ее в переменную.
А если рядом лежат также «Цифровая крепость» Дэна Брауна и «Игра престолов» Джорджа Мартина? Как сохранить их? Можно снова воспользоваться переменными:
А если позади целый книжный шкаф? Вот здесь и появляется проблема. Иногда в Python нужно хранить релевантную информацию в одном объекте, а не разбивать ее по переменным.
Вот зачем нужны структуры данных!
Структуры данных Python
В Python 3 основные структуры данных:
Все три нужны для разных ситуаций и использовать их необходимо по-разному.
Перейдем к деталям!
Первая структура данных Python: Список
Начнем с самого простого — списков в Python.
Список — это последовательность значений. Это данные, заключенные в квадратные скобки и разделенные запятыми. Простой пример — список целых чисел:
Важно понимать, что в Python список является объектом, поэтому работать с ним можно так же, как и с любыми другими типами данных (например, целыми числами, строками, булевыми операторами и так далее). Это значит, что список можно присвоить переменной, чтобы хранить ее таким образом и получать доступ в дальнейшем более простым способом:
Список может содержать другие типы данных, включая строки, логические значения и даже другие списки. Помните собаку Freddie из прошлой статьи?
Ее параметры можно сохранить в одном списке, а не разбивать на 5 разных переменных:
Теперь предположим, что Freddie принадлежит две вещи: кость и маленький мяч. Их можно сохранить внутри списка отдельным списком.
На самом деле, вот так углубляться в дерево списков можно бесконечно. Этот прием (официально он называется «вложенными списками») будет важен при работе с Data Science в Python — например, при создании многомерных массивов numpy для запуска корреляционных анализов… но сейчас не об этом! Главное, что нужно запомнить — списки можно хранить внутри других списков.
Чувствуете себя ученым? Стоило бы, потому что вы создали двухмерный массив размерами 3-на-3.
Как получить доступ к конкретному элементу в списке Python?
Теперь, когда значения сохранены, нужно разобраться, как получать к ним доступ в будущем. Вернуть целый список можно с помощью имени переменной. Например dog
Если вам кажется, что это слишком сложно, просто почитайте открытое письмо известного ученого Дейкстра, написанное в 1982 году: https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html. А теперь просто перестаньте думать об этом и запомните, что так будет всегда!
Вот подробный пример!
Попробуйте вывести все элементы списка один за одним:
Запутанно… Но к этому можно привыкнуть.
Как получить доступ к определенному элементу вложенного списка в Python
Еще один важный момент о Freddie. Нужно вывести его вещи друг за другом
Он будет нулевым элементом пятого элемента:
Как получить доступ к нескольким элементам списка Python
Вот еще один трюк. Можно использовать двоеточие между двумя числами в скобках, чтобы получить последовательность значений.
Пока это все, что вам нужно знать о списках Python.
Вторая структура данных Python: Кортежи
Что такое кортеж в Python? Во-первых, начинающий специалист Data Science не должен много думать об этой структуре. Можете и вовсе пропустить этот раздел.
Если все-таки остались:
Кортеж в Python — почти то же самое, что и список в Python с небольшими отличиями.
В остальном кортежи можно использовать так же, как и списки. Даже возвращать отдельный элемент нужно с помощью квадратных скобок. (Попробуйте book_tuple[1] на новом кортеже).
Еще раз: ничего из вышесказанного не будет вас заботить первое время, но хорошо знать хотя бы что-нибудь о кортежах.
Третья структура данных Python: Словари
Словари — это совсем другая история. Они сильно отличаются от списков и очень часто используются в проектах data science.
Особенность словарей в том, что у каждого значения есть уникальный ключ. Взглянем еще раз на собаку Freddie:
Это значения с параметрами собаки, которые нужно сохранить. В словаре для каждого значения можно назначить свой ключ так, чтобы понимать, что они обозначают.
Вывод заранее форматируется Python. Чтобы лучше разобраться, то же самое можно сделать изначально, перенеся каждое значение на новую строку:
Как можно видеть, вложенный список (в этом примере belongings ) как значение словаря не является проблемой.
Это что касается внешнего вида словарей в Python.
Как получить доступ к конкретному элементу словаря Python
Самое важное, что нужно запомнить о получении доступа к элементу любого типа в любой структуре данных Python, это то, что вне зависимости от структуры (список, кортеж или словарь), нужно всего лишь ввести название структуры и универсальный идентификатор элемента в квадратных скобках (например, [1] ).
То же касается и словарей.
Единственное отличие в том, что для списков и кортежей идентификатором выступает номер элемента, а здесь ключ. Попробуйте:
Примечание: наверняка возникает вопрос, а можно ли использовать число для доступа к значению словаря. Нет, потому что словари в Python по умолчанию не упорядочены — это значит, что ни у одной пары ключ-значение нет своего номера.
Примечание: нельзя также вывести ключ с помощью значения. Python попросту не предназначен для этого.
Проверьте себя
Вы многое узнали о структурах данных. Даже если вы не выполняли прошлые уроки в конце статей, сделайте исключение для этой. Структуры — это то, что придется использовать постоянно, поэтому сделайте себе одолжение и попробуйте разобраться во всем на 100%
Индексирование в Python
Положительные и отрицательные индексы
Допустим у нас есть список или кортеж.
Без потери общности будем работать только со списком х (с кортежем t – тоже самое).
Легко получить i-тый элемент этого списка по индексу.
Внимание! Индексы в Python считаются с нуля (0), как в С++ и Java.
В последней строке мы вылезли за пределы (у нас в списке последний индекс – 10) и получили исключение IndexError.
Но что будет, если мы обратимся к элементу с отрицательным индексом? В С++ такой операцией вы бы прострелили себе ногу. А в Python? IndexError? Нет!
Это совершенно легально. Мы просто получаем элементы не с начала списка, а с конца (-i-тый элемент).
x[-1] – последний элемент.
x[-2] – предпоследний элемент.
Это аналогично конструкции x[len(x)-i]:
Срезы
Срезы, они же slices, позволяют вам получить какую-то часть списка или кортежа.
Форма x[start:end] даст элементы от индекса start (включительно) до end (не включая end). Если не указать start – мы начнем с 0-го элемента, если не указать end – то закончим последним элементом (включительно). Соотвественно, x[:] это тоже самое, что и просто x.
Если end x [:: 2 ] – каждый второй элемент, а x [:: 3 ] – каждый третий.
Отрицательный шаг вернет нам элементы в обратном порядке:
Запись в список по срезу
Можно присвоить части списка, отобранной срезом, некоторый другой список, причем размер среза не обязан равняться размеру присваемого списка.
Если размеры равны (в примере два элемента в срезе и два элемента во втором списке) – происходит замена элементов.
Если они не равны по размеру, то в результате список расширяется или сжимается.
Именованные срезы
Можно заранее создавать срезы с какими-то параметрами без привязки к списку или кортежу встроенной функцией slice . А потом применить этот срез к какому-то списку.
Вместо пустых мест для start, end или step здесь мы пишем None.
В заключение к этому разделу хочу сказать, что срезы списков возвращают списки, срезы кортежей – кортежи.
Индексирование своих объектов
В конце концов, мы можете определить самостоятельно поведение оператор индексации [], определив для своего класса магические методы __getitem__, __setitem__ и __delitem__. Первый вызывается при получении значения по индекса (или индексам), второй – если мы попытаемся нашему объекту что-то присвоить по индексу. А третий – если мы будет пытаться делать del по индексу. Необязательно реализовывать их все. Можно только один, например:
В качестве ключей можно использовать не только целые числа, но и строки или любые другие значения, в том числе slice и Ellipsis. Как вы будете обрабатывать их – решать вам. Естественно, логика, описанная в предыдущих разделах, здесь будет только в том случае, если вы ее сами так реализуете.
Пример. Экземпляр этого класса возвращаем нам список из целых чисел по индексу в виде срезу. Этакий бесконечный массив целых чисел, который почти не занимает памяти.
Можно иметь несколько индексов. Ниже мы суммируем все значения индексов.
Удачи в программировании и жизни!
🐉 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
Списки в Python: полное руководство для начинающих
Представьте, что вы собираетесь заехать за покупками в ближайший супермаркет. Что нужно сделать вначале? Верно! Составить список покупок. А в Python есть структура данных, очень напоминающая такие списки. Собственно, она так и называется — список (англ. list).
Это статья о списках в Python, предназначенная для начинающих. В следующие несколько минут мы познакомимся со списками и рассмотрим самые распространенные операции с ними: срезы и модификации при помощи методов списков.
Итак, давайте погрузимся в тему списков в Python, продолжая проводить аналогии со списками покупок.
Как работают списки
Составляя список покупок, мы записываем нужные нам товары в столбик. В таком виде список легко узнаваем именно как список покупок.
Чтобы Python понял, что имеет дело со списком, нужно заключить все элементы в квадратные скобки ( [] ). Сами элементы при этом разделяются запятыми.
Вот пример создания списка из 6 элементов (пускай это будут товары, которые мы хотим купить).
Изменяемость списков в Python
Имея дело со списком покупок, мы свободно можем его изменять. Например, вычеркнуть овсяное печенье и добавить любимые конфеты. Точно так же можно изменять и списки в Python. Таким образом, списки — изменяемый тип данных.
Вот как можно заменить oatmeal cookies на candy :
Индексация списков в Python
Попытавшись обратиться к элементу по несуществующему индексу, мы получим ошибку — IndexError.
В нашем примере у нас есть список покупок из 6 элементов (диапазон индексов 0-5). Как показано в коде ниже, если мы попытаемся обратиться к элементу под индексом 6, мы получим ошибку, потому что элемента с таким индексом просто нет.
Так же, как список покупок может содержать любые товары (фрукты, овощи, сладости и т. п.), список в Python может содержать элементы любого типа.
Таким образом, список вполне может содержать в себе другие списки в качестве элементов. Это называется вложенностью, а подобные списки — вложенными.
Вот пример вложенного списка покупок, содержащего два списка поменьше:
Как перебирать список в цикле
Если бы нам нужно было не вывести элементы списка, а что-нибудь сделать с каждым из них, лучше было бы использовать range — чтобы получить индексы, а затем перебрать их в цикле.
Как делать срезы списков в Python
Общий шаблон срезов таков:
Срез берется от индекса START (включительно) и до индекса STOP (не включая его), с шагом STEP. Каждый из параметров START, STOP, STEP может быть опущен.
Давайте посмотрим на это в коде:
Операции со списками в Python
Поскольку наш shopping_list содержит только строки, min() возвращает строку, которая шла бы первой, если бы список был упорядочен в алфавитном порядке. max() возвращает строку, которая шла бы последней.
Посмотрим на это в коде:
Мы можем создавать новые списки, объединяя уже существующие — так же, как можем объединять списки покупок.
Методы списков в Python
Помимо уже названных встроенных функций Python имеет еще и несколько специальных методов для работы со списками. С помощью этих методов можно осуществлять разные полезные операции.
Давайте подумаем о списках покупок. Какие операции мы с ними проделываем чаще всего?
Как добавлять элементы в список
Что, если бы мы захотели добавить в список элементы из другого списка (или другого итерируемого объекта)? Вместо того чтобы добавлять их по одному, мы можем воспользоваться методом extend() и добавить все элементы одного объекта в другой.
Оператор + создает новый список, комбинируя списки, указанные в качестве операндов. А методы append() и extend() изменяют список, для которого они вызваны, и не возвращают новых списков.
Как удалять элементы из списка
Мы можем удалять элементы из списка по одному или даже группами.
Если бы мы хотели удалить элемент под определенным индексом, этот индекс можно было бы передать в метод pop() в качестве аргумента.
При этом можно указать как индекс элемента, который нужно удалить, так и срез — чтобы удалить все элементы в указанном диапазоне.
Предположим, мы знаем, какой именно товар в списке покупок мы передумали покупать, но не знаем, какой у него индекс. В подобных случаях можно воспользоваться методом remove() и удалить элемент по значению.
Примечание. При попытке удалить элемент, которого нет в списке, мы получим ValueError.
Сортировка списков в Python
Итоги
Из этой статьи вы узнали, как создавать списки, как брать срезы, как добавлять и удалять элементы из списков, а также — как сортировать списки.














