Статьи

Учебные материалы по языку Python — от основ до продвинутых тем

list

Страница 25 из 34 · 2026-10-26 · 4 мин чтения

Создание

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)Удаляет первое вхождение, иначе ValueErrorO(n)
pop([i])Удаляет и возвращает элемент, по умолчанию последнийO(1) для конца, O(n) иначе
clear()Удаляет все элементыO(n)
index(x[, start, end])Индекс первого вхождения, иначе ValueErrorO(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

Задания

  1. Удалите из списка все вхождения заданного значения без создания нового списка.
  2. Напишите функцию разбиения списка на блоки заданного размера.
  3. Отсортируйте список строк сначала по длине, затем по алфавиту.
  4. Реализуйте стек и очередь на основе списка и deque, сравните скорость.