Python: Коллекции
17.01.2025
Коллекция в Python — это контейнер, где можно хранить множество значений, которые могут быть разного типа. Основная особенность коллекций — это их возможности, например, доступ к значениям по индексу, выполнение операций с их содержимым, преобразование в другие форматы.
Проблемы изучения коллекций
Многие учебные материалы подробно рассказывают про каждый тип коллекции, но редко сравнивают их между собой. Это затрудняет понимание, как использовать разные коллекции для одной задачи. В этом цикле статей устраняется этот пробел.
Для кого эта статья? Для тех, кто знает основы Python и хочет упорядочить свои знания о коллекциях: списках, кортежах, строках, множествах и словарях.
Типы коллекций
Рассматриваются стандартные коллекции:
Список (list) — изменяемый, индексированный.
Кортеж (tuple) — неизменяемый, индексированный.
Строка (string) — неизменяемая, индексированная.
Множество (set, frozenset) — изменяемое/неизменяемое, неиндексированное, уникальные элементы.
Словарь (dict) — изменяемый, содержит пары ключ: значение.
Классификация коллекций
Индексированность
У индексированных коллекций (списки, кортежи, строки) элементы имеют порядковые номера (индексы). Можно обращаться к элементу через его индекс.
Уникальность
Во множестве элементы уникальны. Словари уникальны только по ключам.
Изменяемость
Изменяемые коллекции (списки, множества, словари) позволяют добавлять, изменять и удалять элементы.
Неизменяемые (строки, кортежи, frozenset) не допускают изменений после создания.
Примечание: В словарях ключи должны быть неизменяемыми и хешируемыми, поэтому, например, список в качестве ключа использовать нельзя.
Общие подходы работы с коллекциями
1. Печать содержимого
2. Подсчет элементов
Используется функция len()
:
3. Проверка наличия элемента
4. Итерация в цикле
Можно перебирать элементы коллекции с помощью for
:
Методы для работы с коллекциями
.count()
: считает количество вхождений элемента (для списков, строк, кортежей)..index()
: возвращает индекс первого найденного элемента..copy()
: делает копию коллекции..clear()
: очищает коллекцию (для списков, словарей, множеств).
Конвертация коллекций
Любой тип коллекции можно преобразовать в другой:
Из кортежа в список:
list(my_tuple)
Из списка в множество:
set(my_list)
Пример:
Замечания:
Преобразование множества удаляет дублирующиеся элементы.
При преобразовании в неиндексированную коллекцию теряется порядок.
Нельзя преобразовать изменяемую коллекцию (например, список) в ключ словаря или элемент множества.
Конспект по части 2/4: Индексирование, срезы, сортировка
Индексирование
Что такое индексирование?
Индексированные коллекции имеют четкий порядок элементов. Каждый элемент коллекции получает номер, начиная с нуля. Это позволяет обращаться к элементу, используя его номер.
Пример:
Особенности:
Положительные индексы считают от начала, начиная с 0.
Отрицательные индексы начинают с конца: -1 — последний элемент, -2 — предпоследний и так далее.
Сложные коллекции:
Если коллекция вложенная (например, список списков), можно использовать несколько индексов подряд:
Ограничения:
В неизменяемых коллекциях (строки и кортежи) можно только читать элементы, но не изменять их.
В списках можно менять элементы по индексу:
Срезы
Индексы позволяют извлекать отдельные элементы, но что делать, если нужен диапазон? Для этого есть срезы.
Синтаксис среза:
start
— начальный индекс (включительно).stop
— конечный индекс (не включается в результат).step
— шаг, с которым извлекаются элементы (по умолчанию 1).
Примеры:
Важно:
Если
start
илиstop
выходит за пределы коллекции, ошибки не будет — Python просто возьмет то, что есть.Срезы не изменяют коллекцию, а создают новую.
Изменение списка с помощью срезов: Срезы можно использовать для изменения сразу нескольких элементов:
Сортировка
Сортировка — одна из самых популярных операций с коллекциями. Python предлагает несколько способов сделать это.
Функция sorted()
Эта функция создает новый список с отсортированными элементами, не изменяя оригинальную коллекцию.
Пример:
Дополнительные параметры:
reverse=True
— сортировка в обратном порядке.key
— позволяет сортировать по определенному критерию:
Метод .sort()
В отличие от sorted()
, метод .sort()
изменяет сам список.
Пример:
Обратный порядок
Если требуется вывести элементы в обратном порядке, можно использовать reversed()
или срез:
Конспект по части 3/4: Объединение и обновление коллекций, добавление и удаление элементов
Объединение коллекций
Иногда нужно соединить несколько коллекций в одну. Способы объединения зависят от типа коллекции.
Списки, кортежи и строки
Объединение строк и кортежей: Для строк и кортежей используется оператор
+
, который создает новый объект:Объединение списков: У списков больше возможностей:
Через оператор
+
:Через расширенный синтаксис (Python 3.5+):
Добавление второго списка как элемента (не объединение):
Словари
Словари объединяются иначе, так как они работают с парами "ключ: значение".
Объединение через методы:
С помощью синтаксиса (Python 3.5+):
Замечание: Если ключи совпадают, значения из второго словаря заменяют значения из первого.
Множества
Множества объединяются с помощью операций над ними:
Объединение (
union
):Пересечение (
intersection
):Разность (
difference
):Симметричная разность (
symmetric_difference
): Выбираются элементы, которые не пересекаются:
Объединение с изменением исходной коллекции
Некоторые методы позволяют изменять существующую коллекцию.
Для списков:
Метод
.extend()
добавляет элементы другой коллекции в конец списка:Метод
.append()
добавляет всю коллекцию как один элемент:
Для словарей: Метод
.update()
добавляет пары ключ: значение из другого словаря:Для множеств: Методы с окончанием
_update
:difference_update()
,intersection_update()
и другие изменяют множество:
Добавление и удаление элементов
Работать с содержимым коллекций можно только для изменяемых типов: списков, словарей и множеств.
Добавление элементов
Список:
append()
: добавляет элемент в конец.insert()
: вставляет элемент на указанную позицию.
Множество:
add()
: добавляет новый элемент.
Словарь:
Прямая добавка через ключ:
Удаление элементов
Список:
remove()
: удаляет элемент по значению (ошибка, если элемента нет).pop()
: удаляет элемент по индексу (по умолчанию — последний).
Множество:
remove()
иdiscard()
:
Словарь:
pop()
удаляет элемент по ключу:
Что такое генераторы?
Генераторы — это удобный способ создания коллекций или работы с последовательностями данных. Они позволяют:
Сократить код.
Создавать элементы «на лету», не занимая много памяти.
Применять условия фильтрации и обработки данных.
Типы генераторов
Выражения-генераторы (
generator expressions
) Позволяют генерировать элементы по одному, без создания полной коллекции.Генераторы коллекций:
Генератор списка (list comprehension): создается в квадратных скобках
[]
.Генератор множества (set comprehension): создается в фигурных скобках
{}
.Генератор словаря (dictionary comprehension): пары «ключ: значение» указываются в фигурных скобках
{key: value}
.
Пример:
Синтаксис генераторов
Генераторы используют цикл for
, условия фильтрации (if
), а также выражения для обработки элементов.
Базовый синтаксис:
Пример:
Ветвления (if-else): В генераторах можно использовать условия для обработки элементов.
Пример:
Вложенные циклы: Генераторы поддерживают вложенные циклы.
Пример:
Выражения-генераторы
Выражения-генераторы заключаются в круглые скобки и возвращают элементы по одному. Они экономят память, так как не создают коллекцию.
Пример:
Особенности:
Генератор можно использовать только один раз.
Для повторного использования нужно создавать его заново.
Важно:
Если передать выражение-генератор в функцию, например, sum()
, то дополнительные скобки не нужны:
Генерация строк
Для строк нельзя использовать выражения-генераторы напрямую. Вместо этого применяют метод .join()
:
Работа с enumerate()
и частичный перебор
enumerate()
и частичный переборИспользование enumerate()
enumerate()
enumerate()
добавляет счетчик к каждому элементу, что полезно при фильтрации или обработке по индексу.
Пример:
Частичный перебор
Если нужно обработать только первые несколько элементов, используйте itertools.islice()
:
Преимущества генераторов
Экономия памяти: В отличие от коллекций, генераторы создают элементы по одному, что важно при работе с большими данными.
Компактный код: Генераторы позволяют записывать сложную логику обработки данных в одной строке.
Гибкость: Вы можете легко добавлять условия фильтрации и преобразования элементов.
Last updated