Список в Python нужен каждый раз, когда у вас есть несколько однотипных значений и с ними нужно что-то сделать: добавить новую задачу, убрать выполненную, пройтись по товарам, собрать ошибки, вывести меню или подготовить отчет
В этой статье разберем списки через практику. Будет не одна строчка append, а рабочий порядок: как создать список, добавить элементы, удалить лишнее, пройти циклом, не сломать индексы и собрать маленький трекер задач
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
- Быстрый ориентир: что должен уметь новичок
- Добавление элементов
- Удаление элементов
- Как не получить ошибку при удалении
- Перебор списка циклом
- Практика: маленький трекер задач
- Практика: удалить выполненные задачи
- Практика: найти элемент
- Практика: отсортировать список
- Задания с решениями
- Задача 1. Добавьте три покупки
- Задача 2. Удалите лишний город
- Задача 3. Покажите нумерованное меню
- Задача 4. Оставьте только положительные числа
- Задача 5. Найдите самое длинное слово
- Задача 6. Уберите дубли с сохранением порядка
- Частые ошибки
- Путать индекс и значение
- Удалять элементы во время прямого перебора
- Забывать про пустой список
- Менять исходный список, когда нужна копия
- Как проверить, что тема усвоена
- Часто задаваемые вопросы
- Чем список отличается от строки?
- Когда использовать append, а когда extend?
- Почему первый индекс равен нулю?
- Можно ли хранить в списке словари?
Быстрый ориентир: что должен уметь новичок
После темы про list важно уметь пять вещей: создать список, добавить элемент, получить элемент по индексу, пройти список циклом и безопасно удалить ненужные значения. Этого уже хватает для простых учебных программ, консольных меню, списков покупок, журналов ошибок и маленьких таблиц перед сохранением в файл
Главная мысль такая: список хранит порядок. Первый элемент имеет индекс 0, второй индекс 1, последний можно получить через -1. Если это запомнить, большая часть ошибок со списками становится понятнее
tasks = ["прочитать теорию", "решить задачу", "проверить код"]
print(tasks[0])
print(tasks[-1])
print(len(tasks))
Добавление элементов
Для добавления одного элемента чаще всего используют append. Метод кладет значение в конец списка и меняет исходный список
tasks = []
tasks.append("создать файл")
tasks.append("написать код")
tasks.append("запустить проверку")
print(tasks)
Если нужно добавить сразу несколько элементов, используйте extend. Важно не путать его с append: append добавит весь список как один элемент, а extend разложит значения по отдельности
tasks = ["создать файл"]
new_tasks = ["написать код", "запустить проверку"]
tasks.extend(new_tasks)
print(tasks)
insert добавляет элемент в конкретное место. Индекс 0 означает начало списка
tasks = ["написать код", "запустить проверку"]
tasks.insert(0, "создать файл")
print(tasks)
Удаление элементов
Если известно значение, используйте remove. Он удаляет первое найденное совпадение
tasks = ["создать файл", "написать код", "создать файл"]
tasks.remove("создать файл")
print(tasks)
Если известно место элемента, используйте pop. Метод удаляет элемент и возвращает его, поэтому удобно сохранять удаленное значение в переменную
tasks = ["создать файл", "написать код", "запустить проверку"]
done_task = tasks.pop(0)
print("Выполнено:", done_task)
print("Осталось:", tasks)
Для полной очистки есть clear
tasks = ["создать файл", "написать код"]
tasks.clear()
print(tasks)
Как не получить ошибку при удалении
remove упадет, если значения нет в списке. Поэтому перед удалением часто проверяют наличие через in
tasks = ["создать файл", "написать код"]
target = "запустить проверку"
if target in tasks:
tasks.remove(target)
else:
print("Такой задачи нет")
print(tasks)
С pop похожая история: нельзя удалить элемент из пустого списка
tasks = []
if tasks:
print(tasks.pop())
else:
print("Список пуст")
Такие проверки выглядят простыми, но именно они отличают учебный пример от кода, который не падает на первом необычном вводе
Перебор списка циклом
Обычный перебор нужен, когда важно обработать каждый элемент
tasks = ["создать файл", "написать код", "запустить проверку"]
for task in tasks:
print("Задача:", task)
Если нужен номер элемента, используйте enumerate. Для вывода пользователю часто начинают нумерацию с единицы
tasks = ["создать файл", "написать код", "запустить проверку"]
for number, task in enumerate(tasks, start=1):
print(number, task)
Если нужно собрать новый список, не всегда стоит менять старый. Иногда проще создать новую коллекцию
tasks = ["создать файл", "написать код", "запустить проверку"]
important_tasks = []
for task in tasks:
if "код" in task or "проверку" in task:
important_tasks.append(task)
print(important_tasks)
Практика: маленький трекер задач
Соберем пример, где список действительно используется: добавляем задачи, отмечаем выполненную, показываем остаток и считаем количество дел
tasks = []
tasks.append("Собрать структуру проекта")
tasks.append("Написать функцию")
tasks.append("Проверить результат")
print("Все задачи:")
for number, task in enumerate(tasks, start=1):
print(f"{number}. {task}")
done = tasks.pop(0)
print("Выполнено:", done)
print("Осталось задач:", len(tasks))
for task in tasks:
print("-", task)
Теперь добавим безопасное удаление по названию. Такой кусок часто нужен в учебных меню и маленьких скриптах
tasks = ["Собрать структуру", "Написать код", "Проверить результат"]
task_to_remove = "Написать код"
if task_to_remove in tasks:
tasks.remove(task_to_remove)
print("Удалено:", task_to_remove)
else:
print("Не найдено:", task_to_remove)
print(tasks)
Практика: удалить выполненные задачи
Частая ошибка новичка — удалять элементы из списка прямо во время обычного перебора. Так можно пропустить часть значений. Надежнее собрать новый список или пройти по копии
tasks = [
{"title": "Собрать структуру", "done": True},
{"title": "Написать код", "done": False},
{"title": "Проверить результат", "done": True},
]
active_tasks = []
for task in tasks:
if not task["done"]:
active_tasks.append(task)
print(active_tasks)
То же самое можно записать короче через list comprehension, но сначала лучше понять обычный цикл
active_tasks = [task for task in tasks if not task["done"]]
print(active_tasks)
Практика: найти элемент
Иногда нужно не удалить, а найти первое подходящее значение. Например, первую задачу, где есть слово код
tasks = ["Собрать структуру", "Написать код", "Проверить результат"]
found_task = None
for task in tasks:
if "код" in task:
found_task = task
break
if found_task:
print("Нашли:", found_task)
else:
print("Ничего не найдено")
Переменная found_task = None здесь показывает, что результата пока нет. Это понятнее, чем пытаться сразу взять элемент по индексу и надеяться, что он существует
Практика: отсортировать список
Для простых строк и чисел подходит sort или sorted. sort меняет исходный список, sorted возвращает новый
names = ["Мария", "Анна", "Илья"]
sorted_names = sorted(names)
print(names)
print(sorted_names)
Если список состоит из словарей, нужно указать ключ сортировки
tasks = [
{"title": "Собрать структуру", "priority": 2},
{"title": "Написать код", "priority": 1},
{"title": "Проверить результат", "priority": 3},
]
tasks_by_priority = sorted(tasks, key=lambda task: task["priority"])
for task in tasks_by_priority:
print(task["priority"], task["title"])
Задания с решениями
Задача 1. Добавьте три покупки
Создайте пустой список, добавьте три продукта и выведите каждый продукт с новой строки
products = []
products.append("хлеб")
products.append("молоко")
products.append("сыр")
for product in products:
print(product)
Задача 2. Удалите лишний город
В списке есть город, который нужно убрать. Сделайте проверку, чтобы код не падал, если города нет
cities = ["Казань", "Самара", "Пермь"]
city_to_remove = "Самара"
if city_to_remove in cities:
cities.remove(city_to_remove)
print(cities)
Задача 3. Покажите нумерованное меню
Выведите список команд с номерами от единицы
menu = ["Добавить", "Удалить", "Показать", "Выйти"]
for number, item in enumerate(menu, start=1):
print(f"{number}. {item}")
Задача 4. Оставьте только положительные числа
Создайте новый список, где будут только числа больше нуля
numbers = [-3, 0, 5, 12, -1]
positive = []
for number in numbers:
if number > 0:
positive.append(number)
print(positive)
Задача 5. Найдите самое длинное слово
Пройдите список и сохраните слово с максимальной длиной
words = ["код", "переменная", "цикл", "список"]
longest = ""
for word in words:
if len(word) > len(longest):
longest = word
print(longest)
Задача 6. Уберите дубли с сохранением порядка
Нужно пройти список и добавить значение в результат только один раз
tags = ["python", "sql", "python", "html", "sql"]
unique_tags = []
for tag in tags:
if tag not in unique_tags:
unique_tags.append(tag)
print(unique_tags)
Частые ошибки
Путать индекс и значение
Если в цикле написано for task in tasks, переменная task уже содержит значение. Ее не нужно снова использовать как индекс
tasks = ["создать файл", "написать код"]
for task in tasks:
print(task)
Удалять элементы во время прямого перебора
Если нужно фильтровать список, чаще создавайте новый список. Так поведение проще предсказать
numbers = [1, 2, 3, 4, 5]
even_numbers = []
for number in numbers:
if number % 2 == 0:
even_numbers.append(number)
print(even_numbers)
Забывать про пустой список
Перед pop проверяйте, что в списке есть элементы
queue = []
if queue:
print(queue.pop(0))
else:
print("Очередь пуста")
Менять исходный список, когда нужна копия
Если исходный порядок еще пригодится, используйте sorted, а не sort
scores = [10, 3, 8]
sorted_scores = sorted(scores)
print(scores)
print(sorted_scores)
Как проверить, что тема усвоена
Возьмите список из пяти задач и сделайте с ним четыре действия: добавьте новую задачу, удалите выполненную, выведите нумерованный список и соберите отдельный список важных задач. Если вы можете объяснить каждую строку и заранее предсказать вывод, списки перестали быть абстрактной темой
Для самостоятельной тренировки поменяйте строки на словари: у каждой задачи пусть будут title, priority и done. Это сразу приближает упражнение к реальным данным, где один элемент списка хранит несколько свойств
Часто задаваемые вопросы
Чем список отличается от строки?
Строка хранит текст, а список хранит набор элементов. В списке могут быть строки, числа, словари и другие значения
Когда использовать append, а когда extend?
append добавляет один элемент. extend добавляет элементы из другого списка по отдельности
Почему первый индекс равен нулю?
Так устроена индексация во многих языках программирования. Первый элемент находится на смещении 0, второй на смещении 1
Можно ли хранить в списке словари?
Да. Это обычный способ представить несколько объектов с одинаковыми полями: задачи, товары, пользователей, строки отчета