Списки: создание, индексы, срезы
Списки: создание, индексы, срезы
До сих пор каждая переменная хранила одно значение: одно число, одну строку. Но программы часто работают с наборами данных: список оценок студента, набор имён пользователей, координаты точек. Для хранения последовательностей значений в Python используются списки (list).
Что такое список
Список — это упорядоченная изменяемая коллекция, которая может содержать элементы любых типов. Создаётся в квадратных скобках:
fruits = ["яблоко", "банан", "вишня"]
numbers = [1, 2, 3, 4, 5]
mixed = [42, "текст", 3.14, True, None]
empty = [] # пустой список
Список может хранить элементы разных типов в одном контейнере, хотя на практике лучше хранить однородные данные.
Создание списка
Несколько способов создать список:
# Литерал:
colors = ["красный", "зелёный", "синий"]
# Встроенная функция list():
chars = list("Python") # ['P', 'y', 't', 'h', 'o', 'n']
nums = list(range(5)) # [0, 1, 2, 3, 4]
# Вложенный список (матрица):
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Длина списка: len()
fruits = ["яблоко", "банан", "вишня", "апельсин"]
print(len(fruits)) # 4
print(len([])) # 0
Индексация
Элементы списка нумеруются с 0. Доступ по индексу — квадратные скобки:
fruits = ["яблоко", "банан", "вишня"]
# 0 1 2
print(fruits[0]) # яблоко
print(fruits[1]) # банан
print(fruits[2]) # вишня
Отрицательные индексы считают с конца:
# яблоко банан вишня
# -3 -2 -1
print(fruits[-1]) # вишня (последний)
print(fruits[-2]) # банан (предпоследний)
Обращение по несуществующему индексу вызовет IndexError:
# fruits[10] # IndexError: list index out of range
Изменение элемента
Списки изменяемы — в отличие от строк, их элементы можно менять по индексу:
colors = ["красный", "зелёный", "синий"]
colors[1] = "жёлтый"
print(colors) # ['красный', 'жёлтый', 'синий']
Срезы
Срезы работают так же, как для строк:
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:5]) # [2, 3, 4]
print(nums[:3]) # [0, 1, 2]
print(nums[7:]) # [7, 8, 9]
print(nums[::2]) # [0, 2, 4, 6, 8] — каждый второй
print(nums[::-1]) # [9, 8, 7, ..., 0] — список задом наперёд
Срез возвращает новый список. Исходный не изменяется.
Проверка вхождения: in
fruits = ["яблоко", "банан", "вишня"]
print("банан" in fruits) # True
print("манго" in fruits) # False
print("манго" not in fruits) # True
Перебор через for
scores = [85, 92, 78, 95, 88]
for score in scores:
print(score)
# С индексом:
for i, score in enumerate(scores):
print(f"[{i}] = {score}")
Вложенные списки
Список может содержать другие списки:
matrix = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(matrix[0]) # [1, 2, 3]
print(matrix[1][2]) # 6 — второй ряд, третий элемент
# Перебор матрицы:
for row in matrix:
for elem in row:
print(elem, end=" ")
print()
Копирование списка
Обычное присваивание b = a не копирует список — обе переменные указывают на один и тот же объект:
a = [1, 2, 3]
b = a
b[0] = 99
print(a) # [99, 2, 3] — изменился и a!
Для настоящей копии используйте срез [:] или list():
a = [1, 2, 3]
b = a[:] # мелкая копия
b[0] = 99
print(a) # [1, 2, 3] — не изменился
Проверь себя
Что выведет следующий код?
data = [10, 20, 30, 40, 50]
print(data[1:4])
print(data[-2:])
print(data[::-1])
data[1:4]→[20, 30, 40]data[-2:]→[40, 50]data[::-1]→[50, 40, 30, 20, 10]
Итог
- Список (
list) — упорядоченная изменяемая коллекция в квадратных скобках. - Индексы начинаются с
0; отрицательные индексы считают с конца. - Элементы изменяемы:
lst[i] = значение. - Срезы
lst[start:stop:step]возвращают новый список. in/not inпроверяют вхождение элемента.b = aне копирует список — используйтеb = a[:]для копии.
В следующем уроке познакомимся с методами списка: append, extend, insert, pop и remove — основными инструментами изменения списков.