← Назад к вопросам

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

1.3 Junior🔥 241 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Перевёртывание списка — одна из базовых операций. В Python есть несколько способов, каждый с разными характеристиками по скорости, памяти и читаемости.

1. Встроенный метод .reverse()

Самый эффективный способ — использовать встроенный метод, который изменяет список на месте (in-place).

original_list = [1, 2, 3, 4, 5]

# Перевёртываем список (изменяет исходный список)
original_list.reverse()

print(original_list)  # [5, 4, 3, 2, 1]

Характеристики:

  • Сложность: O(n)
  • Память: O(1) (изменяет на месте)
  • Скорость: Самая быстрая (на C)
  • Побочный эффект: Изменяет исходный список

2. Срез с отрицательным шагом [::-1]

Стандартный Python способ для создания нового перевёрнутого списка:

original_list = [1, 2, 3, 4, 5]

# Создаёт новый список в обратном порядке
reversed_list = original_list[::-1]

print(original_list)   # [1, 2, 3, 4, 5] (не изменился)
print(reversed_list)   # [5, 4, 3, 2, 1] (новый список)

Срезы с шагом:

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

print(arr[::2])      # [0, 2, 4, 6, 8]      — каждый второй
print(arr[1::2])     # [1, 3, 5, 7, 9]      — начиная со второго
print(arr[::-1])     # [9, 8, 7, 6, 5, ...]  — в обратном порядке
print(arr[5:1:-1])   # [5, 4, 3, 2]         — от индекса 5 к 1 в обратном
print(arr[::-2])     # [9, 7, 5, 3, 1]      — в обратном, каждый второй

Характеристики:

  • Сложность: O(n)
  • Память: O(n) (создаёт новый список)
  • Скорость: Очень быстрая (оптимизирована)
  • Побочный эффект: Не изменяет исходный список

3. Функция reversed()

Возвращает итератор в обратном порядке (ленивое вычисление):

original_list = [1, 2, 3, 4, 5]

# reversed() возвращает итератор, не список
reversed_iterator = reversed(original_list)

print(list(reversed_iterator))  # [5, 4, 3, 2, 1] (преобразуем в список)

# Или просто итерируемся
for item in reversed(original_list):
    print(item)  # 5, 4, 3, 2, 1 (по одному)

# Или распакуем
a, b, c, d, e = reversed(original_list)
print(a, b, c, d, e)  # 5 4 3 2 1

Характеристики:

  • Сложность: O(1) для создания, O(n) для итерации
  • Память: O(1) (только итератор, не копирует данные)
  • Скорость: Медленная для одноразового использования, эффективна если не нужен список
  • Побочный эффект: Не изменяет исходный список

4. Ручная реализация с циклом

Этот способ редко используется, но полезен для понимания:

original_list = [1, 2, 3, 4, 5]

# Способ 1: Обмен элементов (in-place)
original_list_copy = original_list.copy()
left, right = 0, len(original_list_copy) - 1

while left < right:
    original_list_copy[left], original_list_copy[right] = \
        original_list_copy[right], original_list_copy[left]
    left += 1
    right -= 1

print(original_list_copy)  # [5, 4, 3, 2, 1]

# Способ 2: Создание нового списка
reversed_list = []
for i in range(len(original_list) - 1, -1, -1):
    reversed_list.append(original_list[i])

print(reversed_list)  # [5, 4, 3, 2, 1]

5. Практические примеры

Пример 1: Проверка палиндрома

def is_palindrome(s: str) -> bool:
    """Проверяет, является ли строка палиндромом"""
    # Удаляем пробелы и приводим к нижнему регистру
    cleaned = s.replace(" ", "").lower()
    # Сравниваем с перевёрнутой версией
    return cleaned == cleaned[::-1]

print(is_palindrome("А роза упала на лапу Азора"))  # True
print(is_palindrome("Hello"))                         # False

Пример 2: Обработка файла в обратном порядке

# Чтение файла в обратном порядке
def read_file_reversed(filename: str) -> list[str]:
    with open(filename, "r") as f:
        lines = f.readlines()
    return lines[::-1]  # Обратный порядок строк

# Или с использованием reversed() для экономии памяти
def read_file_reversed_lazy(filename: str):
    with open(filename, "r") as f:
        lines = f.readlines()
    for line in reversed(lines):
        yield line

Пример 3: Реверс битов в числе

def reverse_bits(n: int, num_bits: int = 32) -> int:
    """Переворачивает биты в числе"""
    # Преобразуем в бинарную строку
    binary = bin(n)[2:].zfill(num_bits)  # bin(5) = 0b101 → 00000101
    # Переворачиваем строку
    reversed_binary = binary[::-1]
    # Преобразуем обратно в число
    return int(reversed_binary, 2)

print(reverse_bits(5))  # 5 (бинарно: 00000...00101 → 10100...00000)

Пример 4: Реверс матрицы (2D список)

def reverse_matrix_rows(matrix: list[list[int]]) -> list[list[int]]:
    """Переворачивает каждую строку матрицы"""
    return [row[::-1] for row in matrix]

def reverse_matrix_order(matrix: list[list[int]]) -> list[list[int]]:
    """Переворачивает порядок строк"""
    return matrix[::-1]

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

print(reverse_matrix_rows(matrix))
# [[3, 2, 1], [6, 5, 4], [9, 8, 7]]

print(reverse_matrix_order(matrix))
# [[7, 8, 9], [4, 5, 6], [1, 2, 3]]

6. Сравнение производительности

import timeit

size = 1_000_000
test_list = list(range(size))

# Способ 1: reverse()
time_1 = timeit.timeit(
    lambda: test_list.copy().__reverse__(),
    number=100
)
print(f".reverse(): {time_1:.6f}s")  # Самый быстрый

# Способ 2: [::-1]
time_2 = timeit.timeit(
    lambda: test_list[::-1],
    number=100
)
print(f"[::-1]: {time_2:.6f}s")  # Быстрый

# Способ 3: reversed()
time_3 = timeit.timeit(
    lambda: list(reversed(test_list)),
    number=100
)
print(f"reversed(): {time_3:.6f}s")  # Медленнее

# Результаты (примерно):
# .reverse(): 0.001234s   ← Самый быстрый
# [::-1]: 0.003456s       ← Быстрый
# reversed(): 0.005678s   ← Медленнее

7. Выбор правильного способа

Используй .reverse() если:

  • Нужно изменить исходный список
  • Критична максимальная производительность
  • Контролируешь использование списка
data = [1, 2, 3, 4, 5]
data.reverse()  # Изменил исходный список
print(data)  # [5, 4, 3, 2, 1]

Используй [::-1] если:

  • Нужен новый перевёрнутый список
  • Исходный список не должен меняться
  • Нужна хорошая производительность
  • Это самый читаемый способ
original = [1, 2, 3, 4, 5]
reversed_copy = original[::-1]
print(original)   # [1, 2, 3, 4, 5] (не изменился)
print(reversed_copy)  # [5, 4, 3, 2, 1]

Используй reversed() если:

  • Нужна экономия памяти (огромный список)
  • Не нужно преобразовывать в список
  • Просто итерируешься один раз
data = [1, 2, 3, 4, 5]
for item in reversed(data):
    print(item)  # Не создаёт новый список, экономит память

8. Реверс специальных структур

from collections import deque

# Реверс deque
q = deque([1, 2, 3, 4, 5])
q.reverse()
print(q)  # deque([5, 4, 3, 2, 1])

# Реверс строки
s = "Hello"
print(s[::-1])  # olleH

# Реверс tuple (создаёт новый кортеж)
t = (1, 2, 3, 4, 5)
print(tuple(reversed(t)))  # (5, 4, 3, 2, 1)

Итоговая рекомендация

СитуацияМетодПричина
Изменить исходный список.reverse()Самый быстрый, экономит память
Создать новый перевёрнутый[::-1]Читаемо, быстро, стандартный способ
Одноразовая итерацияreversed()Экономит память для больших списков
Непонимание что делать[::-1]Универсален и безопасен

В 99% случаев [::-1] — ваш ответ. Это стандартный Python способ, который используется везде.