Задачи на списки в Python с разбором решений
Задачи на списки Python помогают отработать базовые операции: подсчет, сортировку, срезы, поиск и удаление элементов. В подборке 16 упражнений от простых к более сложным, к каждому дано решение и пояснение, где чаще всего ошибаются. Перед практикой есть короткая шпаргалка по функциям и методам списка.

Содержание статьи
Шпаргалка перед решением задач
Список (list) хранит упорядоченный набор любых объектов и может изменяться: элементы добавляются, удаляются и заменяются на месте. Индексация начинается с нуля, отрицательный индекс считает с конца: a[-1] вернет последний элемент.
| Операция | Запись | Изменяет список |
|---|---|---|
| Длина | len(a) | нет |
| Сумма, минимум, максимум | sum(a), min(a), max(a) | нет |
| Добавить в конец | a.append(x) | да |
| Удалить по значению | a.remove(x) | да |
| Удалить по индексу | a.pop(i) | да |
| Отсортировать | a.sort() / sorted(a) | да / нет |
| Развернуть | a.reverse() / a[::-1] | да / нет |
| Найти индекс | a.index(x) | нет |
Полный перечень с примерами есть в статье про методы списка. Главное различие, которое нужно помнить: методы вроде sort() и reverse() меняют исходный список и возвращают None, а функции sorted() и срезы создают новый список.
Базовые задачи
Первые шесть задач решаются одной встроенной функцией или срезом. Попробуйте сначала написать решение сами, а потом сверьтесь с кодом.
Задача 1. Количество элементов
Дан список чисел. Выведите, сколько в нем элементов.
Решение:
my_list = [10, 20, 30, 40, 50]
print("Количество элементов:", len(my_list))
# Количество элементов: 5Функция len() работает за постоянное время: длина хранится внутри объекта, перебора элементов нет.
Задача 2. Обратный порядок
Выведите элементы списка в обратном порядке, не изменяя исходный список.
Решение:
my_list = [1, 2, 3, 4, 5]
reversed_list = my_list[::-1]
print(reversed_list) # [5, 4, 3, 2, 1]Срез с шагом -1 создает копию. Если копия не нужна, вызовите my_list.reverse(). Как устроены срезы с шагом, подробно описано в статье про срезы.
Задача 3. Сумма элементов
Найдите сумму всех чисел списка.
Решение:
my_list = [5, 10, 15, 20]
print("Сумма:", sum(my_list)) # Сумма: 50Задача 4. Максимум и минимум
Найдите наибольший и наименьший элементы списка.
Решение:
my_list = [15, 6, 27, 8, 12]
print("Максимум:", max(my_list)) # 27
print("Минимум:", min(my_list)) # 6Для пустого списка обе функции выбросят ValueError. Чтобы этого избежать, передайте значение по умолчанию: max(my_list, default=None).
Задача 5. Удаление повторов
Удалите из списка повторяющиеся элементы так, чтобы порядок первых вхождений сохранился.
Решение:
my_list = [3, 1, 3, 2, 1, 5]
unique_list = list(dict.fromkeys(my_list))
print(unique_list) # [3, 1, 2, 5]Частый вариант list(set(my_list)) тоже убирает дубликаты, но порядок элементов после множества не гарантирован. Словарь сохраняет порядок вставки, поэтому dict.fromkeys() надежнее. Другие способы собраны в статье про удаление дубликатов из списка.
Задача 6. Сортировка
Отсортируйте список по возрастанию, затем по убыванию.
Решение:
my_list = [35, 17, 42, 11, 29]
print(sorted(my_list)) # [11, 17, 29, 35, 42]
print(sorted(my_list, reverse=True)) # [42, 35, 29, 17, 11]Поиск и изменение элементов
В этих задачах нужно учитывать ситуацию, когда искомого элемента нет. Многие методы списка в таком случае выбрасывают исключение.
Задача 7. Объединение двух списков
Соедините два списка в один новый.
Решение:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2
print(combined) # [1, 2, 3, 4, 5, 6]Оператор + создает новый список. Метод list1.extend(list2) дописывает элементы в существующий и ничего не возвращает.
Задача 8. Индекс элемента
Найдите индекс первого вхождения заданного значения. Если значения нет, выведите -1.
Решение:
my_list = [10, 20, 30, 40, 50]
element = 30
index = my_list.index(element) if element in my_list else -1
print(index) # 2Метод index() при отсутствии значения выбрасывает ValueError, в отличие от строкового find(), которого у списков нет.
Задача 9. Разбиение на части
Разбейте список на части по три элемента.
Решение:
my_list = [1, 2, 3, 4, 5, 6, 7, 8]
size = 3
chunks = [my_list[i:i + size] for i in range(0, len(my_list), size)]
print(chunks) # [[1, 2, 3], [4, 5, 6], [7, 8]]Решение построено на генераторе списка, о нем подробно в статье про list comprehension. В Python 3.12 для этого есть готовая функция itertools.batched(), она возвращает кортежи.
Задача 10. Фильтрация по условию
Оставьте в списке только числа больше 25.
Решение:
my_list = [10, 20, 30, 40, 50]
result = [x for x in my_list if x > 25]
print(result) # [30, 40, 50]Тот же результат дает list(filter(lambda x: x > 25, my_list)), но генератор списка читается проще.
Задача 11. Удаление всех вхождений значения
Удалите из списка все элементы, равные заданному числу.
Решение:
my_list = [1, 3, 2, 3, 4, 3]
value = 3
my_list = [x for x in my_list if x != value]
print(my_list) # [1, 2, 4]Метод remove() удаляет только первое совпадение и падает с ошибкой, если значения нет. Удалять элементы в цикле for по тому же списку нельзя: индексы сдвигаются, и часть элементов пропускается.
Задача 12. Проверка наличия элемента
Проверьте, есть ли значение в списке, и выведите сообщение.
Решение:
my_list = [10, 20, 30, 40, 50]
x = 30
print("есть" if x in my_list else "нет") # естьОператор in перебирает список последовательно. При частых проверках в большом наборе данных быстрее работает множество.
Задачи посложнее
Эти упражнения требуют сочетать несколько приемов: сортировку, словари и вложенные списки.
Задача 13. Второй по величине элемент
Найдите второе по величине значение среди различных чисел списка.
Решение:
nums = [4, 9, 2, 9, 7]
second = sorted(set(nums))[-2]
print(second) # 7Задача 14. Частота элементов
Посчитайте, сколько раз встречается каждый элемент, и выведите самый частый.
Решение:
from collections import Counter
words = ["a", "b", "a", "c", "a", "b"]
counts = Counter(words)
print(counts) # Counter({'a': 3, 'b': 2, 'c': 1})
print(counts.most_common(1)) # [('a', 3)]Задача 15. Циклический сдвиг
Сдвиньте элементы списка вправо на k позиций: последние элементы переходят в начало.
Решение:
nums = [1, 2, 3, 4, 5]
k = 2 % len(nums)
print(nums[-k:] + nums[:-k]) # [4, 5, 1, 2, 3]Остаток от деления защищает от k, большего длины списка. При k = 0 срез nums[-0:] вернул бы весь список, а nums[:-0] пустой, поэтому результат все равно будет верным.
Задача 16. Плоский список из вложенного
Преобразуйте список списков в один плоский список.
Решение:
matrix = [[1, 2], [3, 4, 5], [6]]
flat = [x for row in matrix for x in row]
print(flat) # [1, 2, 3, 4, 5, 6]Порядок циклов в генераторе такой же, как во вложенных for: сначала внешний по строкам, затем внутренний по элементам.
Частые вопросы
Ответы на вопросы, которые возникают при решении задач со списками.
Почему sort() возвращает None?
Метод сортирует список на месте и не создает новый объект. Запись a = a.sort() затирает список значением None. Нужен новый список - используйте sorted(a).
Как скопировать список, чтобы изменения не затронули оригинал?
Для плоского списка подойдут a.copy(), list(a) или a[:]. Если внутри есть вложенные списки, нужна глубокая копия copy.deepcopy(a).
Чем список отличается от кортежа?
Список изменяемый, кортеж нет. Кортеж можно использовать как ключ словаря и элемент множества, а список нельзя.
Как пройти по списку вместе с индексами?
Используйте for i, x in enumerate(a). Это короче и надежнее, чем range(len(a)) с обращением по индексу.