Перейти к содержимому
Editor

Списки в Python: создание, доступ, изменение и перебор

Начальный30 min8 упр.145 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/8 упр.

Вспомните свой любимый музыкальный плейлист. В нём хранится набор песен в определённом порядке. Вы можете добавлять новые песни, удалять старые, менять их местами или сразу перейти к пятой песне.

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

В этом уроке вы научитесь создавать списки, обращаться к элементам по позиции, добавлять и удалять элементы, перебирать их в цикле, делать срезы и обходить самые частые ошибки новичков.

Как создать список в Python

Чтобы создать список, перечислите элементы через запятую внутри квадратных скобок []. Элементы могут быть любого типа: строки, числа, логические значения и даже другие списки.

Создание списков с помощью квадратных скобок
# A list of strings
fruits = ["apple", "banana", "cherry"]
print(fruits)
# A list of numbers
scores = [95, 87, 72, 100, 68]
print(scores)
# A list with mixed types
mixed = ["Alice", 15, True, 3.14]
print(mixed)
Вывод
['apple', 'banana', 'cherry']
[95, 87, 72, 100, 68]
['Alice', 15, True, 3.14]

У каждого элемента списка есть позиция, которая называется индексом. Первый элемент стоит под индексом 0, второй под индексом 1 и так далее. Правило «счёт начинается с нуля» действует почти во всех языках программирования.

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

Пустые списки и конструктор list()
# Empty list - two ways to create one
empty1 = []
empty2 = list()
print(empty1) # []
print(empty2) # []
# The list() constructor can also convert other things into lists
letters = list("hello")
print(letters) # ['h', 'e', 'l', 'l', 'o']
Вывод
[]
[]
['h', 'e', 'l', 'l', 'o']

Как получить элемент списка по индексу в Python

Чтобы взять один элемент списка, укажите его индекс в квадратных скобках после имени списка. Помните: индексация начинается с 0, а не с 1.

Доступ к элементам по положительным индексам
colors = ["red", "green", "blue", "yellow", "purple"]
# Positive indexing (from the front)
print(colors[0]) # red (first item)
print(colors[1]) # green (second item)
print(colors[4]) # purple (fifth item)
Вывод
red
green
purple

Python также поддерживает отрицательные индексы, которые отсчитываются от конца списка. -1 обозначает последний элемент, -2 предпоследний и так далее.

Доступ к элементам по отрицательным индексам
colors = ["red", "green", "blue", "yellow", "purple"]
# Negative indexing (from the end)
print(colors[-1]) # purple (last item)
print(colors[-2]) # yellow (second-to-last)
print(colors[-5]) # red (first item, the long way around)
Вывод
purple
yellow
red

Отрицательные индексы особенно удобны, когда нужен последний элемент, а длина списка неизвестна. my_list[-1] всегда даёт последний элемент.

Проверка длины списка, чтобы избежать IndexError
colors = ["red", "green", "blue"]
print(len(colors)) # 3 items
# This works fine:
print(colors[2]) # blue (index 2 = third item)
# This crashes:
# print(colors[3]) # IndexError! Only indexes 0, 1, 2 exist
Вывод
3
blue

Как изменять списки в Python

Списки изменяемы: их можно менять после создания. Можно заменять отдельные элементы, добавлять новые или объединять списки.

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

Чтобы заменить конкретный элемент, присвойте новое значение по его индексу. Старое значение полностью перезаписывается.

Замена элемента по индексу
fruits = ["apple", "banana", "cherry"]
print(fruits) # ['apple', 'banana', 'cherry']
# Change the second item
fruits[1] = "mango"
print(fruits) # ['apple', 'mango', 'cherry']
Вывод
['apple', 'banana', 'cherry']
['apple', 'mango', 'cherry']

Добавление элементов: append(), insert() и extend()

В Python есть три способа добавить элементы в список. Каждый работает немного по-своему.

Три способа добавить элементы
shopping = ["milk", "eggs"]
# append() adds one item to the END
shopping.append("bread")
print(shopping) # ['milk', 'eggs', 'bread']
# insert() adds one item at a SPECIFIC position
shopping.insert(1, "butter") # Insert at index 1
print(shopping) # ['milk', 'butter', 'eggs', 'bread']
# extend() adds MULTIPLE items from another list
shopping.extend(["cheese", "juice"])
print(shopping) # ['milk', 'butter', 'eggs', 'bread', 'cheese', 'juice']
Вывод
['milk', 'eggs', 'bread']
['milk', 'butter', 'eggs', 'bread']
['milk', 'butter', 'eggs', 'bread', 'cheese', 'juice']
append() добавляет как один элемент
a = [1, 2, 3]
a.append([4, 5])
print(a)  # [1, 2, 3, [4, 5]]
extend() добавляет каждый элемент
a = [1, 2, 3]
a.extend([4, 5])
print(a)  # [1, 2, 3, 4, 5]

Как удалить элементы из списка в Python

Как и для добавления, в Python есть несколько способов удалить элементы. Выбор зависит от того, что вам известно: значение или позиция.

remove() и pop()
pets = ["cat", "dog", "fish", "hamster", "dog"]
# remove() deletes the FIRST matching value
pets.remove("dog")
print(pets) # ['cat', 'fish', 'hamster', 'dog']
# pop() removes by INDEX and returns the removed item
removed = pets.pop(1) # Remove index 1
print(removed) # fish
print(pets) # ['cat', 'hamster', 'dog']
# pop() with no argument removes the LAST item
last = pets.pop()
print(last) # dog
print(pets) # ['cat', 'hamster']
Вывод
['cat', 'fish', 'hamster', 'dog']
fish
['cat', 'hamster', 'dog']
dog
['cat', 'hamster']

remove() ищет значение и удаляет первое найденное совпадение. Если такого значения нет, Python вызывает исключение ValueError.

pop() удаляет элемент по позиции и возвращает его. Это удобно, когда удалённый элемент ещё понадобится, например когда вы сдаёте карты из колоды.

del и clear()
numbers = [10, 20, 30, 40, 50]
# del removes by index (doesn't return the value)
del numbers[0]
print(numbers) # [20, 30, 40, 50]
# clear() removes ALL items
numbers.clear()
print(numbers) # []
Вывод
[20, 30, 40, 50]
[]

Как перебрать список в Python

Одна из самых мощных возможностей списков: их можно перебирать в цикле, то есть выполнять код по разу для каждого элемента. Так вы обработаете сотню элементов, не написав сотню строк.

Простой цикл for по списку
fruits = ["apple", "banana", "cherry"]
# The basic for loop
for fruit in fruits:
print(fruit)
Вывод
apple
banana
cherry

Читайте этот код так: «для каждого фрукта в списке fruits вывести этот фрукт». Python берёт первый элемент, выполняет код с отступом, берёт следующий элемент, снова выполняет код, и так до конца списка.

Иногда вместе с элементом нужен его индекс. Функция enumerate() даёт и то и другое.

Индекс и значение с помощью enumerate()
fruits = ["apple", "banana", "cherry"]
# enumerate() gives you the index AND the item
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
Вывод
0: apple
1: banana
2: cherry

Можно также перебирать список по диапазону индексов. Это удобно, когда нужно сравнивать или изменять элементы по их позиции.

Цикл по range и индексам
scores = [85, 92, 78, 95, 88]
# Loop using range(len(...))
for i in range(len(scores)):
print(f"Student {i + 1}: {scores[i]}")
Вывод
Student 1: 85
Student 2: 92
Student 3: 78
Student 4: 95
Student 5: 88

Как проверить, есть ли элемент в списке Python

Ключевое слово in проверяет, есть ли значение в списке. Результат будет True или False.

Операторы in и not in
colors = ["red", "green", "blue"]
print("red" in colors) # True
print("yellow" in colors) # False
# You can use it in if statements
if "green" in colors:
print("Green is in the list!")
# not in checks for absence
if "purple" not in colors:
print("Purple is NOT in the list.")
Вывод
True
False
Green is in the list!
Purple is NOT in the list.

Это гораздо чище, чем писать цикл для поиска значения вручную. Используйте in всякий раз, когда нужно проверить, есть ли что-то в списке.

Срезы списков в Python

Срез позволяет взять часть списка, а не один элемент. Синтаксис: list[start:end], где start входит в срез, а end не входит.

Простые срезы списка
letters = ["a", "b", "c", "d", "e", "f"]
# Basic slicing: [start:end]
print(letters[1:4]) # ['b', 'c', 'd'] - indexes 1, 2, 3
# Omit start - defaults to beginning
print(letters[:3]) # ['a', 'b', 'c']
# Omit end - defaults to the end
print(letters[3:]) # ['d', 'e', 'f']
# Both omitted - copies the entire list
print(letters[:]) # ['a', 'b', 'c', 'd', 'e', 'f']
Вывод
['b', 'c', 'd']
['a', 'b', 'c']
['d', 'e', 'f']
['a', 'b', 'c', 'd', 'e', 'f']

Правило «конец не включается» поначалу кажется странным, но у него есть приятный плюс: letters[:3] даёт ровно 3 элемента, а letters[3:] всё остальное. Никаких ошибок на единицу.

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

Срезы с шагом
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [start:end:step]
print(numbers[0:10:2]) # [0, 2, 4, 6, 8] - every other item
print(numbers[::3]) # [0, 3, 6, 9] - every third item
# Negative step reverses the list
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Вывод
[0, 2, 4, 6, 8]
[0, 3, 6, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

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

У списков в Python много встроенных методов. Вот те, которые понадобятся вам чаще всего.

sort(), reverse() и count()
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# sort() arranges items in order (changes the original list)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# reverse() flips the list order
numbers.reverse()
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
# count() tells you how many times a value appears
print(numbers.count(1)) # 2
Вывод
[1, 1, 2, 3, 4, 5, 6, 9]
[9, 6, 5, 4, 3, 2, 1, 1]
2
len(), min(), max() и sum()
scores = [85, 92, 78, 95, 88]
# len() - number of items
print(len(scores)) # 5
# min() - smallest value
print(min(scores)) # 78
# max() - largest value
print(max(scores)) # 95
# sum() - total of all items
print(sum(scores)) # 438
# Calculate the average
average = sum(scores) / len(scores)
print(f"Average: {average}") # Average: 87.6
Вывод
5
78
95
438
Average: 87.6

Частые ошибки при работе со списками в Python

У списков есть несколько коварных особенностей, на которых спотыкается почти каждый новичок. Если разобраться в них сейчас, потом вы сэкономите часы отладки.

Алиасинг: оба имени указывают на один список
# The aliasing problem
original = [1, 2, 3]
alias = original # NOT a copy!
alias.append(4)
print(original) # [1, 2, 3, 4] - original changed too!
print(alias) # [1, 2, 3, 4]
Вывод
[1, 2, 3, 4]
[1, 2, 3, 4]
Настоящая копия с помощью [:]
# The fix: make a real copy
original = [1, 2, 3]
real_copy = original[:] # Slice copy
real_copy.append(4)
print(original) # [1, 2, 3] - original is untouched
print(real_copy) # [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]

Практические упражнения

Пора попрактиковаться! Упражнения опираются друг на друга и идут от простых к более сложным. Попробуйте решить каждое, прежде чем открывать подсказки.

Упражнение 1: создайте список и выведите его длину
Напишите код

Создайте список animals из трёх строк: "cat", "dog", "rabbit".

Затем выведите длину списка точно в таком виде:

3
# Create your list
# Print the length
Упражнение 2: последний элемент по отрицательному индексу
Напишите код

Дан список городов. С помощью отрицательного индекса выведите последний город в списке.

Ожидаемый вывод:

Tokyo
cities = ["Paris", "London", "New York", "Tokyo"]
# Print the last city using negative indexing
Упражнение 3: добавьте и удалите товары в списке покупок
Напишите код

У вас есть список покупок. Выполните эти шаги по порядку:

1. Добавьте "bread" в конец списка

2. Удалите "milk" из списка

3. Выведите итоговый список

Ожидаемый вывод:

['eggs', 'cheese', 'butter', 'bread']
shopping = ["eggs", "milk", "cheese", "butter"]
# Step 1: Add "bread" to the end
# Step 2: Remove "milk"
# Step 3: Print the list
Упражнение 4: исправьте ошибку IndexError
Исправьте ошибку

Этот код пытается вывести последний цвет из списка, но падает с ошибкой IndexError. Исправьте ошибку, чтобы код выводил:

purple

Подсказка: в списке 4 элемента. Какие индексы допустимы?

colors = ["red", "green", "blue", "purple"]
print(colors[4])
Упражнение 5: сумма всех чисел с помощью цикла
Напишите код

Напишите программу, которая считает сумму всех чисел списка с помощью цикла for. Не используйте встроенную функцию sum().

Ожидаемый вывод:

150
numbers = [10, 20, 30, 40, 50]
# Calculate the total using a for loop
# Print the total
Упражнение 6: наибольшее число без max()
Напишите код

Найдите наибольшее число в списке с помощью цикла for. Не используйте встроенную функцию max().

Ожидаемый вывод:

95
scores = [72, 85, 95, 60, 88]
# Find the largest score using a loop
# Print the largest score
Упражнение 7: предскажите вывод (алиасинг списков)
Угадайте вывод

Внимательно прочитайте код и предскажите, что он выведет. Подумайте, что происходит, когда две переменные указывают на один и тот же список.

Введите точный вывод (каждое значение с новой строки, если вызовов print несколько).

a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)
Упражнение 8: разверните список без reverse() и [::-1]
Напишите код

Разверните данный список с помощью цикла. Не используйте reverse(), reversed() и [::-1].

Ожидаемый вывод:

[5, 4, 3, 2, 1]
original = [1, 2, 3, 4, 5]
# Reverse the list using a loop
# Print the reversed list

Итоги: что вы узнали о списках в 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 строки цикла одной аккуратной строкой, и узнаете, когда включения уместны, а когда лучше подходит обычный цикл.

Похожие уроки

Урок был полезен?