W3docs

Списки Python: исчерпывающее руководство

Списки Python: создание, доступ, срезы, изменение, сортировка и списковые включения. Все методы списков с примерами.

На этой странице рассматривается всё, что нужно знать о списках Python: как их создавать, читать и изменять содержимое, использовать срезы, применять встроенные методы, писать списковые включения, работать с вложенными списками и распаковывать значения списка в переменные.

Что такое список Python?

Список — самая универсальная встроенная структура данных Python. Он хранит упорядоченную последовательность элементов, каждый из которых может быть любого типа: число, string, boolean, другой список или любой объект. Списки:

  • Упорядочены — элементы сохраняют позицию, которую вы им задаёте.
  • Изменяемы — после создания списка можно добавлять, удалять или изменять элементы.
  • Индексированы — каждый элемент имеет целочисленный индекс, начиная с 0.
  • Разнородны — один список может содержать значения разных типов.

Список создаётся с помощью квадратных скобок, элементы разделяются запятыми:

python— editable, runs on the server

Пустой список записывается как []. Списки также могут содержать смешанные типы:

mixed = [42, 'hello', True, 3.14, None]
print(mixed)
# [42, 'hello', True, 3.14, None]

Доступ к элементам списка

Положительная индексация

Обратитесь к элементу по его позиции (с нуля) в квадратных скобках:

python— editable, runs on the server

Отрицательная индексация

Отрицательные индексы отсчитываются с конца. -1 — последний элемент, -2 — предпоследний и так далее — удобно, когда известна позиция с конца, но не общая длина:

python— editable, runs on the server

Срезы

Срез извлекает подсписок с помощью синтаксиса 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, даже если индексы выходят за границы.

Изменение элементов списка

Так как списки изменяемы, вы можете присвоить новое значение любому индексу:

python— editable, runs on the server

Также можно заменить диапазон элементов с помощью присваивания среза:

nums = [1, 2, 3, 4, 5]
nums[1:3] = [20, 30]
print(nums)
# [1, 20, 30, 4, 5]

Добавление элементов

append() — добавить в конец

append() добавляет один элемент в конец списка на месте:

python— editable, runs on the server

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, если значение не найдено в списке:

python— editable, runs on the server

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 удаляет элемент по индексу или целый срез:

python— editable, runs on the server

clear() — удалить все элементы

clear() очищает список, не удаляя его самого:

fruits = ['apple', 'banana', 'cherry']
fruits.clear()
print(fruits)
# []

Полезные методы списков

Списки Python имеют полный набор встроенных методов. Смотрите Методы списков Python для полного справочника.

len() — длина списка

python— editable, runs on the server

sort() — сортировка на месте

sort() сортирует список в порядке возрастания по умолчанию. Используйте reverse=True для убывания:

python— editable, runs on the server

Используйте параметр 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() — переворот на месте

python— editable, runs on the server

count() — подсчёт вхождений

count(value) возвращает, сколько раз встречается значение:

nums = [1, 2, 2, 3, 2, 4]
print(nums.count(2))
# 3

index() — найти значение

index(value) возвращает индекс первого вхождения. Вызывает ValueError, если не найдено:

nums = [1, 2, 3, 4]
print(nums.index(3))
# 2

copy() — поверхностная копия

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:

python— editable, runs on the server

Только чётные числа:

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 (сторонняя библиотека)

Практика

Практика
Какие из следующих утверждений о списках Python верны?
Какие из следующих утверждений о списках Python верны?
Was this page helpful?