Списки Python: исчерпывающее руководство
Списки Python: создание, доступ, срезы, изменение, сортировка и списковые включения. Все методы списков с примерами.
На этой странице рассматривается всё, что нужно знать о списках Python: как их создавать, читать и изменять содержимое, использовать срезы, применять встроенные методы, писать списковые включения, работать с вложенными списками и распаковывать значения списка в переменные.
Что такое список Python?
Список — самая универсальная встроенная структура данных Python. Он хранит упорядоченную последовательность элементов, каждый из которых может быть любого типа: число, string, boolean, другой список или любой объект. Списки:
- Упорядочены — элементы сохраняют позицию, которую вы им задаёте.
- Изменяемы — после создания списка можно добавлять, удалять или изменять элементы.
- Индексированы — каждый элемент имеет целочисленный индекс, начиная с
0. - Разнородны — один список может содержать значения разных типов.
Список создаётся с помощью квадратных скобок, элементы разделяются запятыми:
Пустой список записывается как []. Списки также могут содержать смешанные типы:
mixed = [42, 'hello', True, 3.14, None]
print(mixed)
# [42, 'hello', True, 3.14, None]Доступ к элементам списка
Положительная индексация
Обратитесь к элементу по его позиции (с нуля) в квадратных скобках:
Отрицательная индексация
Отрицательные индексы отсчитываются с конца. -1 — последний элемент, -2 — предпоследний и так далее — удобно, когда известна позиция с конца, но не общая длина:
Срезы
Срез извлекает подсписок с помощью синтаксиса list[start:stop:step]. Индекс stop не включается.
fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
print(fruits[1:4]) # ['banana', 'cherry', 'date']
print(fruits[:2]) # ['apple', 'banana'] — start defaults to 0
print(fruits[2:]) # ['cherry', 'date', 'elderberry'] — stop defaults to end
print(fruits[::2]) # ['apple', 'cherry', 'elderberry'] — every other item
print(fruits[::-1]) # ['elderberry', 'date', 'cherry', 'banana', 'apple'] — reversed copyСрез всегда возвращает новый список и никогда не вызывает IndexError, даже если индексы выходят за границы.
Изменение элементов списка
Так как списки изменяемы, вы можете присвоить новое значение любому индексу:
Также можно заменить диапазон элементов с помощью присваивания среза:
nums = [1, 2, 3, 4, 5]
nums[1:3] = [20, 30]
print(nums)
# [1, 20, 30, 4, 5]Добавление элементов
append() — добавить в конец
append() добавляет один элемент в конец списка на месте:
insert() — добавить на определённую позицию
insert(index, value) помещает новый элемент перед указанным индексом, не удаляя ничего:
fruits = ['apple', 'banana', 'cherry']
fruits.insert(1, 'mango')
print(fruits)
# ['apple', 'mango', 'banana', 'cherry']extend() — добавить несколько элементов
extend() добавляет все элементы из другого итерируемого объекта (списка, кортежа или string) в конец:
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
print(a)
# [1, 2, 3, 4, 5, 6]Оператор + делает то же самое, но возвращает новый список вместо изменения исходного:
combined = [1, 2, 3] + [4, 5, 6]
print(combined)
# [1, 2, 3, 4, 5, 6]Удаление элементов
remove() — удалить по значению
remove() удаляет первое вхождение значения. Вызывает ValueError, если значение не найдено в списке:
pop() — удалить по индексу
pop() удаляет и возвращает элемент по указанному индексу (по умолчанию: последний элемент). Удобен, когда нужно и получить, и удалить элемент:
fruits = ['apple', 'banana', 'cherry']
last = fruits.pop()
print(last) # cherry
print(fruits) # ['apple', 'banana']
first = fruits.pop(0)
print(first) # apple
print(fruits) # ['banana']del — удалить по индексу или срезу
Оператор del удаляет элемент по индексу или целый срез:
clear() — удалить все элементы
clear() очищает список, не удаляя его самого:
fruits = ['apple', 'banana', 'cherry']
fruits.clear()
print(fruits)
# []Полезные методы списков
Списки Python имеют полный набор встроенных методов. Смотрите Методы списков Python для полного справочника.
len() — длина списка
sort() — сортировка на месте
sort() сортирует список в порядке возрастания по умолчанию. Используйте reverse=True для убывания:
Используйте параметр key, чтобы задать критерий сортировки — например, по длине слова:
words = ['banana', 'apple', 'cherry', 'date']
words.sort(key=len)
print(words)
# ['date', 'apple', 'banana', 'cherry']sort() изменяет список на месте. Чтобы получить отсортированную копию без изменения исходного, используйте встроенную функцию sorted():
original = [3, 1, 2]
s = sorted(original)
print(original) # [3, 1, 2]
print(s) # [1, 2, 3]Смотрите Сортировка списков для дополнительных шаблонов сортировки.
reverse() — переворот на месте
count() — подсчёт вхождений
count(value) возвращает, сколько раз встречается значение:
nums = [1, 2, 2, 3, 2, 4]
print(nums.count(2))
# 3index() — найти значение
index(value) возвращает индекс первого вхождения. Вызывает ValueError, если не найдено:
nums = [1, 2, 3, 4]
print(nums.index(3))
# 2copy() — поверхностная копия
copy() возвращает новый список с теми же элементами верхнего уровня. Изменение копии не влияет на исходный список:
original = [1, 2, 3]
copy = original.copy()
copy.append(4)
print(original) # [1, 2, 3]
print(copy) # [1, 2, 3, 4]Сортировка и разворот: ключевое отличие
sort() и reverse() оба изменяют список на месте и возвращают None. Распространённая ошибка — написать my_list = my_list.sort(), что заменяет список на None. Всегда вызывайте их как отдельные инструкции:
fruits = ['banana', 'apple', 'cherry']
fruits.sort() # correct — modifies in place
# fruits = fruits.sort() # wrong — sets fruits to None
print(fruits)
# ['apple', 'banana', 'cherry']Вложенные списки
Список может содержать другие списки в качестве элементов, образуя двумерную (или более глубокую) структуру:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
print(matrix[0]) # [1, 2, 3]
print(matrix[1][2]) # 6 — row 1, column 2Вложенные списки широко используются для представления сеток, таблиц и матриц.
Списковые включения
Списковое включение — лаконичное однострочное выражение для построения нового списка путём преобразования или фильтрации существующего итерируемого объекта. Синтаксис:
[expression for item in iterable if condition]Часть if condition необязательна.
Квадраты чисел от 1 до 10:
Только чётные числа:
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens)
# [2, 4, 6, 8, 10]Преобразование строк:
fruits = ['apple', 'banana', 'cherry']
upper = [f.upper() for f in fruits]
print(upper)
# ['APPLE', 'BANANA', 'CHERRY']Списковые включения, как правило, быстрее аналогичного цикла for с append(). Смотрите Списковые включения для продвинутых шаблонов.
Распаковка списков
Можно присвоить элементы списка отдельным переменным за один шаг:
a, b, c = ['x', 'y', 'z']
print(a, b, c)
# x y zОператор * (звёздочка) захватывает любое количество оставшихся элементов:
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]Распаковка вызывает ValueError, если количество переменных не совпадает с количеством элементов (если не используется *).
Когда использовать список
| Ситуация | Рекомендация |
|---|---|
| Упорядоченная коллекция с изменяемым размером | Список |
| Фиксированная коллекция, которая не должна меняться | Кортеж |
Быстрая проверка принадлежности (in) | Множество |
| Сопоставление ключ-значение | Словарь |
| Большие числовые массивы | numpy.array (сторонняя библиотека) |