Гид по технологиям

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

5 min read Python Обновлено 07 Jan 2026
Перевернуть список в Python — методы и советы
Перевернуть список в Python — методы и советы

Блоки кода Python, демонстрирующие операции с массивами

Зачем нужен разворот списка

Переворот списка — частая операция: нужно показать элементы в обратном порядке, реализовать LIFO-логику, подготовить данные для визуализации или сравнить последовательности в обратном порядке. Важно понимать, когда разворот должен менять оригинал, а когда — возвращать копию.

Короткий обзор методов

  • Сохранить копию: цикл for с добавлением, list comprehension, срезы, list(reversed(…)).
  • Модифицировать оригинал на месте: list.reverse().

Исходный пример

Во всех примерах будем использовать один и тот же список:

languages = [1, 2, 3, 4, 5, 6, 7, 8, 9]

1. Создать копию с помощью цикла for

Подходит, когда разворот — часть более сложной логики (доп. проверки, фильтрация на лету).

# Создаём пустой список для результата
reversed_list = []
# Начинаем с последнего индекса
reducer = len(languages) - 1
# Перебираем исходный список и добавляем элементы в обратном порядке
for _ in languages:
    reversed_list.append(languages[reducer])  # добавляем элемент
    reducer -= 1  # уменьшаем индекс

print(reversed_list)
# Вывод: [9, 8, 7, 6, 5, 4, 3, 2, 1]

Плюсы: гибкость (можно вставлять условия и трансформации). Минусы: более многословно.

2. Разворот с помощью list comprehension

Компактно и читаемо, когда вам нужно просто создать перевёрнутую копию.

# Индексные значения от len(languages)-1 до 0 включительно
reversed_list = [languages[i] for i in range(len(languages) - 1, -1, -1)]
print(reversed_list)
# Вывод: [9, 8, 7, 6, 5, 4, 3, 2, 1]

3. Использовать срезы (slicing)

Коротко и питоновски. Возвращает новую копию списка.

rev_list = languages[::-1]
print(rev_list)
# Вывод: [9, 8, 7, 6, 5, 4, 3, 2, 1]

Подсказка: синтаксис a[b:c:d] — d отрицательный означает шаг назад.

4. Метод list.reverse()

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

languages = [1, 2, 3, 4, 5, 6, 7, 8, 9]
languages.reverse()
print(languages)
# Вывод: [9, 8, 7, 6, 5, 4, 3, 2, 1]

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

5. Встроенная функция reversed

reversed возвращает итератор, поэтому вы получите копию только если явно обернёте в list().

languages = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(reversed(languages)))
# Вывод: [9, 8, 7, 6, 5, 4, 3, 2, 1]

Полезно, когда нужно пройтись по элементам в обратном порядке без создания полной копии (перебор через for).

Сложность и использование памяти

  • Временная сложность всех перечисленных подходов — O(n).
  • Память: методы, возвращающие новый список (list comprehension, slicing, list(reversed(…)), цикл с добавлением), требуют O(n) дополнительной памяти. list.reverse() — O(1) дополнительной памяти (in-place). reversed() сам по себе возвращает итератор и требует O(1), но list(reversed(…)) требует O(n).

Факт: для больших списков выбирайте метод, который соответствует ограничениям по памяти и требованиям к исходному объекту.

Сравнительная матрица

МетодМеняет оригиналВозвращает копиюПамятьПростота
Цикл for с копированиемНетДаO(n)средняя
List comprehensionНетДаO(n)высокая
Срез languages[::-1]НетДаO(n)очень высокая
list.reverse()ДаНетO(1)высокая
reversed (итератор)НетИтераторO(1) / O(n) при list()высокая

Когда какой метод выбирать

  • Нужно сохранить исходный список и получить новый — срез или list comprehension.
  • Хотите простоту и читаемость — используйте languages[::-1].
  • Ограничение по памяти и возможность изменить исходник — list.reverse().
  • Нужен итератор для ленивой обработки (без полной копии) — reversed().
  • Нужна сложная логика при формировании перевёрнутого списка — цикл for.

Когда разворот не подходит или даёт неожиданные результаты

  • Многомерные списки: разворот верхнего уровня не переворачивает вложенные списки.
  • Списки с изменяемыми объектами: в обоих списках (оригинал и копии) будут ссылки на одни и те же объекты; изменение вложенного объекта повлияет на все копии.
  • Потоковые/стримовые данные: разворот требует буферизации всего набора (если нужен полный переворот).

Критерии приёмки

  • Тест должен проверить, что результат содержит те же элементы, но в обратном порядке.
  • Если оригинал должен быть сохранён — убедиться, что исходный список не изменился.
  • Для in-place разворота проверить, что id объекта тот же, но порядок элементов изменён.

Руководство для ролей

  • Для frontend-разработчика: используйте разворот на уровне сервера или шаблона; если данные большие, отдавайте уже перевёрнутыми.
  • Для backend-разработчика: выбирайте list.reverse(), если данные не нужны в исходном порядке; иначе — s[::-1] для краткости.
  • Для инженера данных: для потоков лучше избегать разворота; подумайте о другом порядке выдачи (например, обратный счётчик, пагинация).

Шпаргалка — один взгляд

  • Быстро и питоновски: languages[::-1]
  • In-place: languages.reverse()
  • Ленивый перебор: reversed(languages)
  • С трансформацией: [f(x) for x in reversed(languages)] или comprehension с индексами

Мини-методология при выборе

  1. Определите, нужно ли сохранять исходный список.
  2. Оцените размер данных и ограничения по памяти.
  3. Выберите метод: reverse() для in-place, slicing или comprehension для копии, reversed() для итерации.
  4. Напишите тесты (проверка порядка, проверка сохранности исходного объекта).

Примеры тест-кейсов

  • Пустой список -> пустой список.
  • Список с одним элементом -> тот же элемент.
  • Список с повторяющимися значениями -> порядок инвертирован, значения сохранены.
  • Проверка, что list.reverse() меняет тот же объект (id сохраняется).

Дополнительные примеры и трюки

  • Комбинация с map/filter: [f(x) for x in languages[::-1] if cond(x)].
  • Переворот строки: s[::-1] (строки тоже последовательности).

Заключение

В Python есть несколько надёжных способов перевернуть список. Выбор зависит от: нужно ли сохранить исходный объект, ограничений по памяти и желаемой читабельности кода. Для большинства случаев достаточно среза languages[::-1] или list(reversed(languages)). Для in-place операций используйте list.reverse().

Важно тестировать граничные случаи и помнить про поведение с вложенными и изменяемыми объектами.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство