Методы списка Python: краткий справочник
Встроенные методы списка в Python - это 11 функций, которые вызываются через точку и позволяют добавлять, удалять, искать и упорядочивать элементы. Здесь они собраны в одну сводную таблицу с возвращаемыми значениями и скоростью работы, сгруппированы по задачам и снабжены короткими примерами. Отдельный раздел посвящен ошибкам, которые чаще всего допускают при работе с ними.

Содержание статьи
Все методы списка в одной таблице
У типа list ровно одиннадцать публичных методов, их можно увидеть командой [m for m in dir(list) if not m.startswith('_')]. В таблице n - длина списка, k - количество добавляемых элементов.
| Метод | Что делает | Возвращает | Сложность |
|---|---|---|---|
| append(x) | Добавляет один элемент в конец | None | O(1) |
| extend(iterable) | Добавляет в конец все элементы коллекции | None | O(k) |
| insert(i, x) | Вставляет элемент перед позицией i | None | O(n) |
| remove(x) | Удаляет первое вхождение значения | None | O(n) |
| pop(i=-1) | Удаляет элемент по индексу | Удаленный элемент | O(1) с конца, O(n) из середины |
| clear() | Удаляет все элементы | None | O(n) |
| index(x, start, end) | Ищет позицию первого вхождения | int | O(n) |
| count(x) | Считает, сколько раз встречается значение | int | O(n) |
| sort(key, reverse) | Сортирует список на месте | None | O(n log n) |
| reverse() | Разворачивает порядок элементов | None | O(n) |
| copy() | Создает поверхностную копию | Новый список | O(n) |
Обратите внимание на третий столбец: восемь методов из одиннадцати изменяют сам список и возвращают None. Значение возвращают только pop(), index(), count() и copy(). Развернутое описание каждого метода с параметрами есть в статье о методах списка.
Добавление элементов: append, extend, insert
Метод append() кладет в конец ровно один объект, каким бы он ни был. extend() перебирает переданную коллекцию и добавляет ее элементы по одному. Разница заметна, когда добавляют список или строку.
a = [1, 2]
a.append([3, 4])
print(a) # [1, 2, [3, 4]] - вложенный список как один элемент
b = [1, 2]
b.extend([3, 4])
b.extend('ab')
print(b) # [1, 2, 3, 4, 'a', 'b'] - строка разобрана на символы
b.insert(0, 'start')
print(b[:3]) # ['start', 1, 2]Метод insert() принимает индекс, перед которым ставится элемент. Индекс больше длины списка не вызывает ошибку: элемент просто окажется в конце. Отрицательный индекс считается с конца, поэтому insert(-1, x) поставит x перед последним элементом, а не после него. Вставка в начало длинного списка работает медленно, так как все элементы сдвигаются на одну позицию.
Удаление элементов: remove, pop, clear
Три метода удаления отличаются тем, как указывается элемент. remove() ищет по значению, pop() работает с индексом и возвращает удаленное, clear() очищает весь список.
tasks = ['почта', 'отчет', 'звонок', 'отчет']
tasks.remove('отчет') # удалит только первое вхождение
print(tasks) # ['почта', 'звонок', 'отчет']
last = tasks.pop() # без аргумента - последний элемент
first = tasks.pop(0)
print(first, last, tasks) # почта отчет ['звонок']
tasks.clear()
print(tasks) # []remove() выбрасывает ValueError, если значения нет, а pop() на пустом списке выбрасывает IndexError. Поэтому перед удалением проверяют наличие через оператор in или ловят исключение. Чтобы убрать все вхождения значения, удобнее построить новый список: [t for t in tasks if t != 'отчет']. Другие способы избавиться от повторов описаны в статье об удалении дубликатов из списка.
Поиск и подсчет: index и count
index() возвращает позицию первого найденного элемента и умеет искать в части списка: второй и третий аргументы задают границы поиска. count() возвращает количество вхождений и никогда не выбрасывает исключение, при отсутствии значения он просто вернет 0.
marks = [5, 4, 5, 3, 5]
print(marks.count(5)) # 3
print(marks.index(5)) # 0
print(marks.index(5, 1)) # 2 - поиск начиная с позиции 1
print(marks.count(2)) # 0
positions = [i for i, m in enumerate(marks) if m == 5]
print(positions) # [0, 2, 4] - все позиции сразуЕсли нужно только проверить наличие элемента, используйте x in marks: это короче и не требует обработки ValueError. При частых проверках в большом списке выгоднее один раз превратить его в множество, где поиск выполняется за O(1).
Порядок и копирование: sort, reverse, copy
sort() упорядочивает элементы на месте. Параметр key принимает функцию, по результату которой сравниваются элементы, а reverse=True меняет направление. Сортировка устойчивая: элементы с одинаковым ключом сохраняют исходный порядок.
names = ['ольга', 'Борис', 'анна', 'Виктор']
names.sort()
print(names) # ['Борис', 'Виктор', 'анна', 'ольга'] - заглавные идут раньше
names.sort(key=str.lower)
print(names) # ['анна', 'Борис', 'Виктор', 'ольга']
names.sort(key=len, reverse=True)
print(names[0]) # ВикторТонкости сортировки сложных данных разобраны в статье о методе sort. Метод reverse() просто переставляет элементы в обратном порядке, ничего не сравнивая.
copy() создает новый список с теми же элементами. Копия поверхностная: вложенные списки и словари не копируются, обе переменные ссылаются на одни и те же внутренние объекты.
matrix = [[1, 2], [3, 4]]
clone = matrix.copy()
clone[0].append(99)
print(matrix) # [[1, 2, 99], [3, 4]] - изменился и оригиналДля полностью независимой копии вложенной структуры нужен copy.deepcopy(). Все способы копирования и их отличия собраны в материале о копировании списка.
Типичные ошибки при работе с методами
Большинство ошибок связано с тем, что методы изменяют список на месте. Ниже самые частые ситуации и их исправления.
nums = nums.sort()записывает в переменнуюNone. Нужно либо просто вызватьnums.sort(), либо использовать функциюsorted(nums), которая возвращает новый список.a.append(1, 2)вызываетTypeError: append принимает ровно один аргумент. Для нескольких значений естьextend([1, 2]).a.extend(5)тоже ошибка, число нельзя перебрать. Одиночное значение добавляют через append.- Удаление элементов внутри цикла
for x in a: a.remove(x)пропускает элементы, так как индексы сдвигаются. Перебирайте копиюa[:]или стройте новый список. b = aне создает копию, обе переменные указывают на один список, и изменения черезbвидны вa.
nums = [3, 1, 2]
result = nums.sort()
print(result) # None
print(nums) # [1, 2, 3] - отсортирован сам списокПомимо методов, со списками работают встроенные функции len(), sorted(), reversed(), sum(), а также операторы +, *, in и del. Полный перечень приведен в документации Python.
Частые вопросы
Короткие ответы на вопросы о методах списка.
Сколько методов у списка в Python?
Одиннадцать: append, extend, insert, remove, pop, clear, index, count, sort, reverse и copy. Остальные имена в выводе dir(list) являются служебными методами с двойным подчеркиванием.
Чем pop() отличается от remove()?
pop() удаляет элемент по индексу и возвращает его, а remove() удаляет по значению и возвращает None.
Как добавить элемент в начало списка?
Вызовите a.insert(0, x). Если вставлять в начало приходится постоянно, используйте collections.deque с методом appendleft(), он работает за O(1).
Почему print(a.append(5)) выводит None?
append изменяет список и ничего не возвращает. Сначала вызовите метод, затем выведите сам список: a.append(5) и print(a).