Самое вкусное в конце, читайте внимательно!
Не забываем юзать срезы
Для тех, кто не знает, слайсы -это такая, штука, позволяющая выбирать, какие-то части массива. Например, отрезок листа от 1 до 7ого элемента или каждый второй элемент. Это, кстати, и со строками работает.
Синтаксиc:
lst[start = 0: end = len(lst): step = 1]
Такая запись вернет каждый step-ый элемент от старта до конца, включая старт. Вот несколько примеров.
!!! Важно помнить, что слайс возвращает новый список, а не изменяет текущий!
Сортировка листа по ключу
Пусть у вас есть какой-нибудь сложный объект. Вам нужно отсортировать список экземпляров данного класса по какому-то параметру.
Как это сделать? Неужели придется писать свой алгоритм сортировки O(nlog(n)), с учетом особенностей сравнения объектов?!
Нет! Мы можем сказать стандартному методу сортировки листа, как сортировать наши экземпляры.
Для этого надо будет передать в метод list.sort(key=how_to_sort) функцию, которая и будет задавать, какой объект больше другого.
Что за аргумент такой? key - функция, принимающая элемент списка и возвращающая как бы его вес в этом списке. Легкие пойдут вниз, тяжелые вверх, как мы знаем: от большего к меньшему... логично... Как рассчитывать вес мы определяем сами. Вот пример:
List comprehension
Что это такое? Не знаю, как это нормально объяснить, просто, это инструмент, позволяющий элегантно создавать списки, фильтровать их.
Например:
Еще есть место для условной конструкции, тогда в создаваемый лист попадут только элементы, удовлетворяющие условию.
В общем:
res = [someValue for element in iterable if condition]
Map-ка и filter
Что за map такой? Map - это функция такая... даа....
Нууу... Она применяет какую-то функцию ко всем элементам переданного массива данных.
Вспомните как вы считываете числа через пробел:
Функция map привела все строковые числа из строки в целочисленный тип.
Так же мы можем получить их список таким образом:
!!! Интересный факт !!! Под капотом map с-функция, поэтому, люди говорят, работает быстрее циклов.
C фильтром похожая история, просто он вернет список с элементами, удовлетворяющими условию:
Очень похоже на List comprehension.
Распаковка кортежей в for
Бывает удобно, например, когда у вас массив точек на плоскости, но вы не хотите обращаться к каждой компоненте [0] или [1], а хотите что-то более осмысленное:
Так же вы можете распаковать кортеж или список следующим образом
То есть записи *tuple эквивалентна записи tuple[0], tuple[1], tuple[2], ... в коде питон (ну, почти)
NamedTuples
Маст хев, если вам нужно сделать структурку данных просто, чтобы связать данные в единый объект.
Не забудьте импортировать namedtuple из collections!
Очереди - наше все
List в питоне аналогичен ArrayList в Java или vector в C++, то есть представляет собой динамический массив в памяти. Преимущество заключается в получении доступа к i-ому элементу за O(1), но вставка и удаление элементов хоть и имеют амортизационное время T(1), но в худшем случае сложность работы составит O(n).
Поэтому, если вы не планируете часто залезать в середину списка, а хотите просто добавлять элементы взад-вперед и проходится по структуре в цикле for, то связный список - ваш выбор.