Найти тему

Python фишки для работы с коллекциями

Оглавление

Самое вкусное в конце, читайте внимательно!

Не забываем юзать срезы

Для тех, кто не знает, слайсы -это такая, штука, позволяющая выбирать, какие-то части массива. Например, отрезок листа от 1 до 7ого элемента или каждый второй элемент. Это, кстати, и со строками работает.

Синтаксиc:

lst[start = 0: end = len(lst): step = 1]

Такая запись вернет каждый step-ый элемент от старта до конца, включая старт. Вот несколько примеров.

-2

!!! Важно помнить, что слайс возвращает новый список, а не изменяет текущий!

Сортировка листа по ключу

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

Как это сделать? Неужели придется писать свой алгоритм сортировки O(nlog(n)), с учетом особенностей сравнения объектов?!

Нет! Мы можем сказать стандартному методу сортировки листа, как сортировать наши экземпляры.

Для этого надо будет передать в метод list.sort(key=how_to_sort) функцию, которая и будет задавать, какой объект больше другого.

Что за аргумент такой? key - функция, принимающая элемент списка и возвращающая как бы его вес в этом списке. Легкие пойдут вниз, тяжелые вверх, как мы знаем: от большего к меньшему... логично... Как рассчитывать вес мы определяем сами. Вот пример:

-3

List comprehension

Что это такое? Не знаю, как это нормально объяснить, просто, это инструмент, позволяющий элегантно создавать списки, фильтровать их.

Например:

-4

Еще есть место для условной конструкции, тогда в создаваемый лист попадут только элементы, удовлетворяющие условию.

-5
-6

В общем:

res = [someValue for element in iterable if condition]

Map-ка и filter

Что за map такой? Map - это функция такая... даа....

Нууу... Она применяет какую-то функцию ко всем элементам переданного массива данных.

Вспомните как вы считываете числа через пробел:

-7

Функция map привела все строковые числа из строки в целочисленный тип.

Так же мы можем получить их список таким образом:

-8

!!! Интересный факт !!! Под капотом map с-функция, поэтому, люди говорят, работает быстрее циклов.

-9

C фильтром похожая история, просто он вернет список с элементами, удовлетворяющими условию:

-10
-11

Очень похоже на List comprehension.

Распаковка кортежей в for

Бывает удобно, например, когда у вас массив точек на плоскости, но вы не хотите обращаться к каждой компоненте [0] или [1], а хотите что-то более осмысленное:

-12

Так же вы можете распаковать кортеж или список следующим образом

-13

То есть записи *tuple эквивалентна записи tuple[0], tuple[1], tuple[2], ... в коде питон (ну, почти)

NamedTuples

Маст хев, если вам нужно сделать структурку данных просто, чтобы связать данные в единый объект.

Не забудьте импортировать namedtuple из collections!

-14

Очереди - наше все

List в питоне аналогичен ArrayList в Java или vector в C++, то есть представляет собой динамический массив в памяти. Преимущество заключается в получении доступа к i-ому элементу за O(1), но вставка и удаление элементов хоть и имеют амортизационное время T(1), но в худшем случае сложность работы составит O(n).

Поэтому, если вы не планируете часто залезать в середину списка, а хотите просто добавлять элементы взад-вперед и проходится по структуре в цикле for, то связный список - ваш выбор.

-15
-16
-17