Эффективное обращение списков в Python

Списки являются одними из основных и наиболее часто используемых структур данных в Python. Список — это изменяемый и упорядоченный набор объектов, который также может хранить повторяющиеся значения. Их даже можно использовать в качестве очередей и стеков (хотя deque может быть более эффективным).

Обращение списка — довольно распространенная задача, выполняемая разработчиками при написании приложений Python. В сегодняшнем кратком руководстве мы продемонстрируем несколько различных способов обращения списка, а также обсудим, какой подход работает лучше, особенно при работе со списками, состоящими из больших объемов данных.

Использование нарезки с отрицательным размером шага

Теперь предположим, что у нас есть следующий список, состоящий из некоторых числовых значений:

>>> my_lst = [10, 0, 30, 25, 40, 100, 80]

Мы можем перевернуть список, используя нарезку и размер шага 1.

>>> my_lst_reversed = my_lst[::-1]
>>> my_lst_reversed
[80, 100, 40, 25, 30, 0, 10]

Нотация [::-1] по существу делает две вещи:

  • Он выбирает все элементы списка (первые : )
  • Он указывает отрицательный размер шага, равный 1, что означает, что элементы извлекаются в обратном порядке (от конца к началу).

Если вы хотите узнать больше о нарезке и индексировании в Python, вы можете обратиться к одной из моих предыдущих статей здесь, на Medium.



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

Если вы хотите перевернуть список на месте (или выполнить итерацию по элементам перевернутого списка), то есть несколько других альтернатив, которые намного эффективнее, чем нарезка с отрицательным размером шага.

Использование метода list.reverse()

Если вы хотите перевернуть элементы списка на месте (это означает, что вы на самом деле не хотите создавать еще одну копию исходного списка), то метод list.reverse() является наиболее эффективным способом сделать это.

>>> my_lst = [10, 0, 30, 25, 40, 100, 80]
>>> my_lst.reverse()
>>> my_lst
[80, 100, 40, 25, 30, 0, 10]

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

Использование функции reverse()

Наконец, еще одна альтернатива — встроенная функция reversed(), которая возвращает обратный итератор.

Возврат обратного iterator.

seq должен быть объектом, имеющим метод __reversed__() или поддерживающим протокол последовательности (метод __len__() и метод __getitem__() с целочисленными аргументами, начинающимися с 0).

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

>>> my_lst = [10, 0, 30, 25, 40, 100, 80]
>>> my_lst_reverse_iter = reversed(my_lst)
>>> my_lst_reverse_iter
<list_reverseiterator object at 0x10afcae20>

Как видите, функция reversed() вернула итератор, который мы можем перебрать в цикле:

>>> for element in my_lst_reverse_iter:
...     print(element)
... 
80
100
40
25
30
0
10

Обратите внимание, что вы даже можете преобразовать итератор в список:

>>> my_lst = [10, 0, 30, 25, 40, 100, 80]
>>> my_lst_reverse = list(reversed(my_lst))
>>> my_lst_reverse
[80, 100, 40, 25, 30, 0, 10]

Но если это ваша конечная цель, то лично я бы выбрал подход list.reverse().

Последние мысли

В сегодняшнем кратком руководстве мы продемонстрировали два разных способа обращения списка объектов в Python. В частности, мы продемонстрировали, как это сделать, используя нарезку с размером шага, метод reverse() из list, а также встроенный метод reversed() в Python.

Обобщить,

  • Если вы хотите перевернуть список на месте, выберите list.reverse().
  • Если вы хотите создать копию списка в обратном порядке, используйте нарезку с отрицательным размером шага (например, [::-1])
  • Если вы хотите выполнить итерацию по перевернутому списку, используйте функцию reversed().

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



Статьи по теме, которые вам также могут понравиться