Использование списков в качестве стеков. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование списков в качестве стеков.



Методы списков делают возможным очень легко использовать список как стек, в котором последний добавленный элемент есть первый извлеченный элемент ("последним вошел, первым вышел"). Для добавления элемента вверх стека используйте append(). Для извлечения элемента из верха стека, используйте pop() без конкретного индекса. Например:

>>> stack = [3, 4, 5]>>> stack.append(6)>>> stack.append(7)>>> stack[3, 4, 5, 6, 7]>>> stack.pop()7>>> stack[3, 4, 5, 6]>>> stack.pop()6>>> stack.pop()5>>> stack[3, 4]

 

Использование списков в качестве очередей.

Также возможно использовать список как очередь, где первый добавленный элемент есть первый извлеченный элемент ("первым вошел, первым вышел"); однако списки не эффективны для этой цели. В то время как добавление с помощью append() и извлечение с помощью pop() с конца списка осуществляются быстро, добавление с помощью insert() или извлечение с помощью pop() из начала списка происходит медленно (потому что все другие элементы должны быть сдвинуты на один).

Для реализации очереди используйте collections.deque, который был разработан для быстрых добавлений и извлечений с обоих концов. Например:

>>> from collections import deque>>> queue = deque([ "Eric", "John", "Michael" ])>>> queue.append("Terry")      # Terry прибыл >>> queue.append("Graham")     # Graham прибыл >>> queue.popleft()            # Первый прибывший теперь покинул 'Eric' >>> queue.popleft()            # Второй прибывший теперь покинул 'John' >>> queue                       # Остальная очередь в порядке прибытия deque([ 'Michael', 'Terry', 'Graham' ])

 

Генераторы списков.

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

Например, предположим, мы хотим создать такой список квадратов:

>>> squares = []>>> for x in range(10):...     squares.append(x**2)...>>> squares[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Заметьте, что создается (или перезаписывается) переменная под именем x, которая продолжает существовать после завершения цикла. Мы можем вычислить список квадратов без какого-либо побочного эффекта так:

squares = list(map(lambda x: x**2, range(10)))

что эквивалентно:

squares = [x**2 for x in range(10)]

Это более кратко и читабельно.

Генератор списка состоит из скобок, содержащих выражение, за которым следует for, затем ни одной или больше for или условий if. Результатом будет новый список, полученный от вычисления выражения в данном контексте присутствующих записей for и if. Например, этот listcomp сочетает в себе элементы двух списков, если они не равны:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x!= y][(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

и это эквивалент для:

>>> combs = []>>> for x in [1,2,3]:...      for y in [3,1,4]:...          if x!= y:...             combs.append((x, y))...>>> combs[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Заметьте, что порядок операторов for и if одинаков в обоих данных частях кода.

Если выражение является кортежем (как (x, y) в предыдущем примере), оно должно быть заключено в скобки.

>>> vec = [-4, -2, 0, 2, 4]>>> # создает новый список с удвоенными значениями >>> [x*2 for x in vec][-8, -4, 0, 4, 8]>>> # фильтрует список, исключая отрицательные числа >>> [x for x in vec if x >= 0][0, 2, 4]>>> # применяет функцию для всех элементов >>> [abs(x) for x in vec][4, 2, 0, 2, 4]>>> # вызывает метод для каждого элемента >>> freshfruit = [ ' banana', ' loganberry ', 'passion fruit ' ]>>> [weapon.strip() for weapon in freshfruit][ 'banana', 'loganberry', 'passion fruit' ]>>> # создает список двойных кортежей как (число, квадрат) >>> [(x, x**2) for x in range(6)][(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]>>> # кортеж должен быть заключен в скобки, иначе возбуждается ошибка >>> [x, x**2 for x in range(6)] File "<stdin>", line 1, in? [x, x**2 for x in range(6)]          ^SyntaxError: invalid syntax>>> # делает список одноуровневым, используя listcomp с двумя 'for' >>> vec = [[1,2,3], [4,5,6], [7,8,9]]>>> [num for elem in vec for num in elem][1, 2, 3, 4, 5, 6, 7, 8, 9]

Генератор списков может содержать сложные выражения и вложенные функции:



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 72; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.54.63 (0.005 с.)