Python:Рецепты/Оставляем N последних элементов: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 18: | Строка 18: | ||
''deque(maxlen=N)'' создает очередь фиксированной длины. После заполнения очереди, самый старый элемент удаляется. | ''deque(maxlen=N)'' создает очередь фиксированной длины. После заполнения очереди, самый старый элемент удаляется. | ||
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <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 | <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 | <syntaxhighlight lang="python"> | ||
q.append(6) | q.append(6) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 42: | Строка 42: | ||
Посмотрим, что находится в q(это вводить не надо): | Посмотрим, что находится в q(это вводить не надо): | ||
<syntaxhighlight lang="python | <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 | <syntaxhighlight lang="python"> | ||
q.append(7) | q.append(7) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 56: | Строка 56: | ||
Посмотрим, что находится в q(это вводить не надо): | Посмотрим, что находится в q(это вводить не надо): | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
deque([3, 4, 5, 6, 7], maxlen=5) | deque([3, 4, 5, 6, 7], maxlen=5) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 66: | Строка 66: | ||
В данном примере мы проходим по строкам файла и ищем совпадение с заданным текстом. При совпадении выводим сначала ''N'' предыдущих строк и потом последнюю совпавшую строку: | В данном примере мы проходим по строкам файла и ищем совпадение с заданным текстом. При совпадении выводим сначала ''N'' предыдущих строк и потом последнюю совпавшую строку: | ||
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <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 | <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 | <syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
1 python | 1 python | ||
-------------------- | -------------------- |
Текущая версия от 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)
№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
--------------------
См.также
Внешние ссылки
- Справочник языка Python
- Python
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Рецепты
- Рецепты Python
- Последовательности в Python
- Работа с последовательностями в Python
- Распаковка в Python
- Работа со структурами данных в Python
- Структуры данных Python
- Последовательности
- Работа с последовательностями
- Распаковка
- Работа со структурами данных
- Структуры данных