Python:Рецепты/Оставляем N последних элементов

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Оставляем N последних элементов

Задача

Вы хотите хранить ограниченное количество элементов, которое вы получаете в ходе выполнения итерации.

Решение

Для решения данной задачи подойдет collections.deque.

Пример

№1

deque(maxlen=N) создает очередь фиксированной длины. После заполнения очереди, самый старый элемент удаляется.

1 from collections import deque
2 q = deque(maxlen=5)
3 q.append(1)
4 q.append(2)
5 q.append(3)
6 q.append(4)
7 q.append(5)

Посмотрим, что находится в q(это вводить не надо):

deque([1, 2, 3, 4, 5], maxlen=5)

Добавим следующий элемент:

q.append(6)

Посмотрим, что находится в q(это вводить не надо):

deque([2, 3, 4, 5, 6], maxlen=5)

Как видим 1 слева пропала, 6 справа добавилось.

Добавим следующий элемент:

q.append(7)

Посмотрим, что находится в q(это вводить не надо):

deque([3, 4, 5, 6, 7], maxlen=5)
Pixel Art Mini Meow Animated.gif Добавление или удаление элемента в очереди имеет сложность O(1), а вставка или удаление элемента в начале списка имеет сложность O(N)


№2

В данном примере мы проходим по строкам файла и ищем совпадение с заданным текстом. При совпадении выводим сначала N предыдущих строк и потом последнюю совпавшую строку:

 1 from collections import deque
 2 
 3 def search(lines, pattern, history=5):
 4     previous_lines = deque(maxlen=history)
 5     for line in lines:
 6         if pattern in line:
 7             yield line, previous_lines
 8         previous_lines.append(line)
 9 
10 		
11 with open("file.txt") as f:
12     for line, prevlines in search(f, 'python', 5):
13         for pline in prevlines:
14             print(pline, end='')
15         print(line, end='')
16         print('-'*20)

Содержимое файла:

1 python
2 python1
3 test python python
4 John
5 test1
6 python
7 python
8 python
9 python
10 python
11 python

Результат:

 1 1 python
 2 --------------------
 3 1 python
 4 2 python1
 5 --------------------
 6 1 python
 7 2 python1
 8 3 test python python
 9 --------------------
10 1 python
11 2 python1
12 3 test python python
13 4 John
14 5 test1
15 6 python
16 --------------------
17 2 python1
18 3 test python python
19 4 John
20 5 test1
21 6 python
22 7 python
23 --------------------
24 3 test python python
25 4 John
26 5 test1
27 6 python
28 7 python
29 8 python
30 --------------------
31 4 John
32 5 test1
33 6 python
34 7 python
35 8 python
36 9 python
37 --------------------
38 5 test1
39 6 python
40 7 python
41 8 python
42 9 python
43 10 python
44 --------------------
45 6 python
46 7 python
47 8 python
48 9 python
49 10 python
50 11 python
51 --------------------

См.также

Внешние ссылки