Создание
a = [1, 2, 3]b = list("abc")c = list(range(5))d = [0] * 3e = []f = list()g = [x * x for x in range(5)]Список хранит ссылки на объекты и может содержать значения разных типов.
Ловушка с повторением
rows = [[0] * 3] * 3rows[0][0] = 1print(rows)Результат: [[1, 0, 0], [1, 0, 0], [1, 0, 0]] — все строки одна и та же. Правильно:
rows = [[0] * 3 for _ in range(3)]rows[0][0] = 1print(rows)Операции
a = [10, 20, 30, 40, 50]print(a[0], a[-1])print(a[1:4])print(a[::2])print(a[::-1])print(len(a))print(30 in a)print(a + [60])print([1, 2] * 2)print(a == [10, 20, 30, 40, 50])print([1, 2] < [1, 3])a[0] = 99a[1:3] = [0]del a[0]print(a)Списки сравниваются лексикографически.
Методы list
| Метод | Описание | Сложность |
|---|---|---|
append(x) | Добавляет элемент в конец | O(1) |
extend(iterable) | Добавляет все элементы последовательности | O(k) |
insert(i, x) | Вставляет элемент на позицию | O(n) |
remove(x) | Удаляет первое вхождение, иначе ValueError | O(n) |
pop([i]) | Удаляет и возвращает элемент, по умолчанию последний | O(1) для конца, O(n) иначе |
clear() | Удаляет все элементы | O(n) |
index(x[, start, end]) | Индекс первого вхождения, иначе ValueError | O(n) |
count(x) | Количество вхождений | O(n) |
sort(*, key=None, reverse=False) | Сортировка на месте | O(n log n) |
reverse() | Разворот на месте | O(n) |
copy() | Поверхностная копия | O(n) |
a = [3, 1, 4, 1, 5]a.append(9)a.extend([2, 6])a.insert(0, 0)a.remove(1)print(a.pop())print(a.pop(0))print(a.index(4))print(a.count(1))print(a)append и extend
a = [1, 2]a.append([3, 4])print(a)b = [1, 2]b.extend([3, 4])print(b)c = [1, 2]c += [3, 4]print(c)Результат: [1, 2, [3, 4]], [1, 2, 3, 4], [1, 2, 3, 4].
Сортировка
sort меняет список на месте и возвращает None, sorted создаёт новый список из любой последовательности:
data = [3, 1, 2]print(sorted(data))print(sorted(data, reverse=True))print(data)data.sort()print(data)Параметр key задаёт функцию, значение которой используется для сравнения:
words = ["banana", "Apple", "cherry"]print(sorted(words))print(sorted(words, key=str.lower))print(sorted(words, key=len))people = [("Anna", 30), ("Boris", 25), ("Clara", 30)]print(sorted(people, key=lambda p: (-p[1], p[0])))Сортировка в Python устойчивая: элементы с равными ключами сохраняют исходный порядок. Это позволяет сортировать по нескольким критериям последовательными проходами.
Для ключей-атрибутов пригодны operator.itemgetter и operator.attrgetter:
from operator import itemgetterrows = [{"n": "a", "v": 2}, {"n": "b", "v": 1}]print(sorted(rows, key=itemgetter("v")))Копирование
import copya = [[1, 2], [3, 4]]b = ac = a.copy()d = a[:]e = list(a)f = copy.deepcopy(a)a[0][0] = 99print(c)print(f)copy, срез и list() создают поверхностные копии — вложенные списки остаются общими. deepcopy копирует рекурсивно.
Распаковка
a, b, c = [1, 2, 3]first, *rest = [1, 2, 3, 4]*head, last = [1, 2, 3, 4]x, (y, z) = 1, (2, 3)combined = [*[1, 2], *"ab", *range(2)]print(combined)Полезные приёмы
a = [1, 2, 3, 4, 5]print(sum(a), min(a), max(a))print(list(reversed(a)))print(list(zip(a, a[1:])))print(a[len(a) // 2])print([x for x in a if x % 2])nested = [[1, 2], [3], [4, 5]]flat = [x for sub in nested for x in sub]print(flat)unique = list(dict.fromkeys([3, 1, 3, 2, 1]))print(unique)dict.fromkeys сохраняет порядок первого появления элементов.
Бинарный поиск
Для отсортированного списка есть модуль bisect:
import bisecta = [1, 3, 5, 7]print(bisect.bisect_left(a, 5))print(bisect.bisect_right(a, 5))bisect.insort(a, 4)print(a)Производительность
appendиpop()с конца — быстрые операцииinsert(0, x)иpop(0)— медленные, так как сдвигают все элементы. Для очередей используйтеcollections.deque- Проверка
x in list— линейный поиск. Для частых проверок используйтеset - Списковое включение быстрее цикла с
append
Задания
- Удалите из списка все вхождения заданного значения без создания нового списка.
- Напишите функцию разбиения списка на блоки заданного размера.
- Отсортируйте список строк сначала по длине, затем по алфавиту.
- Реализуйте стек и очередь на основе списка и
deque, сравните скорость.
