Списки в Python: создание, доступ, изменение и перебор
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Вспомните свой любимый музыкальный плейлист. В нём хранится набор песен в определённом порядке. Вы можете добавлять новые песни, удалять старые, менять их местами или сразу перейти к пятой песне.
Список в Python устроен точно так же. Это упорядоченная коллекция элементов, которую можно менять когда угодно. Списки покупок, имена студентов, рекорды в игре, цвета пикселей: списки входят в число самых полезных инструментов Python.
В этом уроке вы научитесь создавать списки, обращаться к элементам по позиции, добавлять и удалять элементы, перебирать их в цикле, делать срезы и обходить самые частые ошибки новичков.
Как создать список в Python
Чтобы создать список, перечислите элементы через запятую внутри квадратных скобок []. Элементы могут быть любого типа: строки, числа, логические значения и даже другие списки.
['apple', 'banana', 'cherry'] [95, 87, 72, 100, 68] ['Alice', 15, True, 3.14]
У каждого элемента списка есть позиция, которая называется индексом. Первый элемент стоит под индексом 0, второй под индексом 1 и так далее. Правило «счёт начинается с нуля» действует почти во всех языках программирования.
Можно также создать пустой список и добавлять в него элементы позже. Так делают часто, когда заранее неизвестно, что окажется в списке.
[] [] ['h', 'e', 'l', 'l', 'o']
Как получить элемент списка по индексу в Python
Чтобы взять один элемент списка, укажите его индекс в квадратных скобках после имени списка. Помните: индексация начинается с 0, а не с 1.
red green purple
Python также поддерживает отрицательные индексы, которые отсчитываются от конца списка. -1 обозначает последний элемент, -2 предпоследний и так далее.
purple yellow red
Отрицательные индексы особенно удобны, когда нужен последний элемент, а длина списка неизвестна. my_list[-1] всегда даёт последний элемент.
3 blue
Как изменять списки в Python
Списки изменяемы: их можно менять после создания. Можно заменять отдельные элементы, добавлять новые или объединять списки.
Замена элемента по индексу
Чтобы заменить конкретный элемент, присвойте новое значение по его индексу. Старое значение полностью перезаписывается.
['apple', 'banana', 'cherry'] ['apple', 'mango', 'cherry']
Добавление элементов: append(), insert() и extend()
В Python есть три способа добавить элементы в список. Каждый работает немного по-своему.
['milk', 'eggs', 'bread'] ['milk', 'butter', 'eggs', 'bread'] ['milk', 'butter', 'eggs', 'bread', 'cheese', 'juice']
a = [1, 2, 3]
a.append([4, 5])
print(a) # [1, 2, 3, [4, 5]]a = [1, 2, 3]
a.extend([4, 5])
print(a) # [1, 2, 3, 4, 5]Как удалить элементы из списка в Python
Как и для добавления, в Python есть несколько способов удалить элементы. Выбор зависит от того, что вам известно: значение или позиция.
['cat', 'fish', 'hamster', 'dog'] fish ['cat', 'hamster', 'dog'] dog ['cat', 'hamster']
remove() ищет значение и удаляет первое найденное совпадение. Если такого значения нет, Python вызывает исключение ValueError.
pop() удаляет элемент по позиции и возвращает его. Это удобно, когда удалённый элемент ещё понадобится, например когда вы сдаёте карты из колоды.
[20, 30, 40, 50] []
Как перебрать список в Python
Одна из самых мощных возможностей списков: их можно перебирать в цикле, то есть выполнять код по разу для каждого элемента. Так вы обработаете сотню элементов, не написав сотню строк.
apple banana cherry
Читайте этот код так: «для каждого фрукта в списке fruits вывести этот фрукт». Python берёт первый элемент, выполняет код с отступом, берёт следующий элемент, снова выполняет код, и так до конца списка.
Иногда вместе с элементом нужен его индекс. Функция enumerate() даёт и то и другое.
0: apple 1: banana 2: cherry
Можно также перебирать список по диапазону индексов. Это удобно, когда нужно сравнивать или изменять элементы по их позиции.
Student 1: 85 Student 2: 92 Student 3: 78 Student 4: 95 Student 5: 88
Как проверить, есть ли элемент в списке Python
Ключевое слово in проверяет, есть ли значение в списке. Результат будет True или False.
True False Green is in the list! Purple is NOT in the list.
Это гораздо чище, чем писать цикл для поиска значения вручную. Используйте in всякий раз, когда нужно проверить, есть ли что-то в списке.
Срезы списков в Python
Срез позволяет взять часть списка, а не один элемент. Синтаксис: list[start:end], где start входит в срез, а end не входит.
['b', 'c', 'd'] ['a', 'b', 'c'] ['d', 'e', 'f'] ['a', 'b', 'c', 'd', 'e', 'f']
Правило «конец не включается» поначалу кажется странным, но у него есть приятный плюс: letters[:3] даёт ровно 3 элемента, а letters[3:] всё остальное. Никаких ошибок на единицу.
Можно добавить третье число, которое называется шагом. Оно указывает Python, через сколько позиций брать следующий элемент.
[0, 2, 4, 6, 8] [0, 3, 6, 9] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Полезные методы списков в Python
У списков в Python много встроенных методов. Вот те, которые понадобятся вам чаще всего.
[1, 1, 2, 3, 4, 5, 6, 9] [9, 6, 5, 4, 3, 2, 1, 1] 2
5 78 95 438 Average: 87.6
Частые ошибки при работе со списками в Python
У списков есть несколько коварных особенностей, на которых спотыкается почти каждый новичок. Если разобраться в них сейчас, потом вы сэкономите часы отладки.
[1, 2, 3, 4] [1, 2, 3, 4]
[1, 2, 3] [1, 2, 3, 4]
a = [1, 2, 3]
b = a # b IS a
b.append(4)
print(a) # [1, 2, 3, 4]a = [1, 2, 3]
b = a[:] # b is a COPY of a
b.append(4)
print(a) # [1, 2, 3]Практические упражнения
Пора попрактиковаться! Упражнения опираются друг на друга и идут от простых к более сложным. Попробуйте решить каждое, прежде чем открывать подсказки.
Создайте список animals из трёх строк: "cat", "dog", "rabbit".
Затем выведите длину списка точно в таком виде:
3Дан список городов. С помощью отрицательного индекса выведите последний город в списке.
Ожидаемый вывод:
TokyoУ вас есть список покупок. Выполните эти шаги по порядку:
1. Добавьте "bread" в конец списка
2. Удалите "milk" из списка
3. Выведите итоговый список
Ожидаемый вывод:
['eggs', 'cheese', 'butter', 'bread']Этот код пытается вывести последний цвет из списка, но падает с ошибкой IndexError. Исправьте ошибку, чтобы код выводил:
purpleПодсказка: в списке 4 элемента. Какие индексы допустимы?
Напишите программу, которая считает сумму всех чисел списка с помощью цикла for. Не используйте встроенную функцию sum().
Ожидаемый вывод:
150Найдите наибольшее число в списке с помощью цикла for. Не используйте встроенную функцию max().
Ожидаемый вывод:
95Внимательно прочитайте код и предскажите, что он выведет. Подумайте, что происходит, когда две переменные указывают на один и тот же список.
Введите точный вывод (каждое значение с новой строки, если вызовов print несколько).
Разверните данный список с помощью цикла. Не используйте reverse(), reversed() и [::-1].
Ожидаемый вывод:
[5, 4, 3, 2, 1]Итоги: что вы узнали о списках в Python
Отличная работа, вы дошли до конца урока! Вот краткий обзор всего, что вы теперь знаете:
| Понятие | Что делает | Пример |
|---|---|---|
| Создание списка | Хранит элементы по порядку | fruits = ["a", "b"] |
| Доступ по индексу | Получает один элемент | fruits[0], fruits[-1] |
| Изменение элементов | Меняет значение | fruits[0] = "cherry" |
append() | Добавляет в конец | fruits.append("date") |
insert() | Добавляет в нужную позицию | fruits.insert(1, "fig") |
remove() | Удаляет по значению | fruits.remove("a") |
pop() | Удаляет по индексу | fruits.pop(0) |
Цикл for | Обрабатывает каждый элемент | for f in fruits: |
in / not in | Проверяет, есть ли элемент | "a" in fruits |
| Срезы | Берут часть списка | fruits[1:3] |
sort() / reverse() | Меняют порядок элементов | fruits.sort() |
len() / sum() | Считают количество или сумму | len(fruits) |
Списки входят в число самых востребованных структур данных в Python. Они есть почти в каждой реальной программе: от веб-приложений до анализа данных и разработки игр.
Что дальше?
В следующем уроке, [Списковые включения в Python](/python/python-comprehensions) (list comprehensions), вы освоите мощный приём, который позволяет создавать и преобразовывать списки одной строкой кода.
Вы увидите, как заменить 4 строки цикла одной аккуратной строкой, и узнаете, когда включения уместны, а когда лучше подходит обычный цикл.