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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
(не показаны 3 промежуточные версии 1 участника)
Строка 18: Строка 18:
''deque(maxlen=N)'' создает очередь фиксированной длины. После заполнения очереди, самый старый элемент удаляется.
''deque(maxlen=N)'' создает очередь фиксированной длины. После заполнения очереди, самый старый элемент удаляется.


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
from collections import deque
from collections import deque
q = deque(maxlen=5)
q = deque(maxlen=5)
Строка 30: Строка 30:
Посмотрим, что находится в q(это вводить не надо):
Посмотрим, что находится в q(это вводить не надо):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
deque([1, 2, 3, 4, 5], maxlen=5)
deque([1, 2, 3, 4, 5], maxlen=5)
</syntaxhighlight>
</syntaxhighlight>
Строка 36: Строка 36:
Добавим следующий элемент:
Добавим следующий элемент:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
q.append(6)
q.append(6)
</syntaxhighlight>
</syntaxhighlight>
Строка 42: Строка 42:
Посмотрим, что находится в q(это вводить не надо):
Посмотрим, что находится в q(это вводить не надо):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
deque([2, 3, 4, 5, 6], maxlen=5)
deque([2, 3, 4, 5, 6], maxlen=5)
</syntaxhighlight>
</syntaxhighlight>
Строка 50: Строка 50:
Добавим следующий элемент:
Добавим следующий элемент:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
q.append(7)
q.append(7)
</syntaxhighlight>
</syntaxhighlight>
Строка 56: Строка 56:
Посмотрим, что находится в q(это вводить не надо):
Посмотрим, что находится в q(это вводить не надо):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
deque([3, 4, 5, 6, 7], maxlen=5)
deque([3, 4, 5, 6, 7], maxlen=5)
</syntaxhighlight>
</syntaxhighlight>


{{Спойлер|Добавление или удаление элемента в очереди имеет сложность O(1), а вставка или удаление элемента в начале списка имеет сложность O(N)}}
{{Примечание1|Добавление или удаление элемента в очереди имеет сложность O(1), а вставка или удаление элемента в начале списка имеет сложность O(N)}}


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


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
from collections import deque
from collections import deque


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


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
1 python
1 python
2 python1
2 python1
Строка 103: Строка 103:
Результат:
Результат:


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
1 python
1 python
--------------------
--------------------
Строка 158: Строка 158:


=См.также=
=См.также=
{{ads}}


=Внешние ссылки=
=Внешние ссылки=
Строка 165: Строка 163:
<references />
<references />


{{SEO
{{Навигационная таблица/Портал/Python}}
|Заголовок статьи=Python:Рецепты - Оставляем N последних элементов / Онлайн справочник - wikihandbk.com
|Ключевые слова=python, рецепты python, Оставляем N последних элементов
|Описание статьи=
|Изображение статьи для Open Graph=
|Адрес страницы для schemaNewsArticle=<nowiki>http://wikihandbk.com/wiki/Python:Рецепты/Оставляем N последних элементов</nowiki>
|Изображение статьи для schemaNewsArticle=<nowiki></nowiki>
|Высота изображения статьи для schemaNewsArticle=
|Ширина изображения статьи для schemaNewsArticle=
|Дата публикации для schemaNewsArticle=2020-04-21
|Автор=Мякишев Е.А.
|Издатель=myagkij
|Логотип издателя для schemaNewsArticle=<nowiki>http://wikihandbk.com/ruwiki/images/6/61/Tech_geek_logo_1x.jpg</nowiki>
|Ширина логотипа издателя для schemaNewsArticle=60
|Высота логотипа издателя для schemaNewsArticle=45
}}


[[Категория:Рецепты]]
[[Категория:Рецепты]]

Текущая версия от 18:25, 14 мая 2023

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


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

Задача

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

Решение

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

Пример

№1

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

from collections import deque
q = deque(maxlen=5)
q.append(1)
q.append(2)
q.append(3)
q.append(4)
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)
Примечание

Добавление или удаление элемента в очереди имеет сложность O(1), а вставка или удаление элемента в начале списка имеет сложность O(N)

№2

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

from collections import deque

def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
            yield line, previous_lines
        previous_lines.append(line)

		
with open("file.txt") as f:
    for line, prevlines in search(f, 'python', 5):
        for pline in prevlines:
            print(pline, end='')
        print(line, end='')
        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 python
--------------------
1 python
2 python1
--------------------
1 python
2 python1
3 test python python
--------------------
1 python
2 python1
3 test python python
4 John
5 test1
6 python
--------------------
2 python1
3 test python python
4 John
5 test1
6 python
7 python
--------------------
3 test python python
4 John
5 test1
6 python
7 python
8 python
--------------------
4 John
5 test1
6 python
7 python
8 python
9 python
--------------------
5 test1
6 python
7 python
8 python
9 python
10 python
--------------------
6 python
7 python
8 python
9 python
10 python
11 python
--------------------

См.также

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