Collections.deque.popleft: примеры (PYTHON)

Использование функции deque.popleft для работы с очередями
Раздел: Коллекции, Очереди
collections.deque.popleft: object

Описание функции deque.popleft()

Метод deque.popleft() является частью класса collections.deque в Python. Он предназначен для удаления и возврата крайнего левого элемента двусторонней очереди (дека).

Функция применяется в ситуациях, когда необходима реализация структуры данных FIFO (First-In, First-Out), например, для организации очереди задач, обработки потоков данных или реализации алгоритмов обхода графа.

Метод не принимает никаких аргументов. Его вызов всегда выполняется без параметров: deque.popleft().

Возвращаемое значение - элемент, который был удален из начала очереди. Если на момент вызова дека пуста, метод popleft() вызывает исключение IndexError.

Короткие примеры использования

Пример 1: Базовое использование.

from collections import deque

d = deque(['a', 'b', 'c'])
removed_item = d.popleft()
print(f"Удаленный элемент: {removed_item}")
print(f"Очередь после popleft: {list(d)}")
Удаленный элемент: a
Очередь после popleft: ['b', 'c']

Пример 2: Обработка пустой очереди.

from collections import deque

d = deque()
try:
    item = d.popleft()
except IndexError as e:
    print(f"Ошибка: {e}")
Ошибка: pop from an empty deque

Похожие функции в Python

  • deque.pop() - удаляет и возвращает крайний правый элемент дека. Применяется для реализации стека (LIFO).
  • list.pop(0) - аналогичная операция для списка, но имеет линейную сложность O(n), тогда как deque.popleft() выполняется за O(1).
  • queue.Queue.get() - потокобезопасный метод для удаления элемента из очереди. Используется в многопоточных программах.

Для реализации очереди предпочтительнее использовать collections.deque из-за эффективности операций с обоими концами. Для многопоточных сред подходит queue.Queue.

Типичные ошибки

Основная ошибка - вызов метода для пустой очереди без проверки.

from collections import deque

d = deque()
# Ошибочный код
item = d.popleft()  # IndexError
IndexError: pop from an empty deque

Рекомендуется использовать проверку длины или обработку исключений.

if d:
    item = d.popleft()
else:
    print("Очередь пуста")

Другая ошибка - путаница между popleft() и pop().

d = deque([1, 2, 3])
item = d.pop()  # Удалится правый элемент (3), а не левый
print(item)
3

История изменений

Метод deque.popleft() присутствует в языке Python с момента добавления модуля collections в версии 2.4. Существенных изменений в его поведении не происходило. Основные улучшения связаны с производительностью и внутренней реализацией класса deque.

Расширенные примеры

Пример 1: Реализация очереди с ограниченной длиной.

Пример python
from collections import deque

def process_tasks(task_queue, max_size):
    if len(task_queue) >= max_size:
        # Удаляем самую старую задачу при переполнении
        old_task = task_queue.popleft()
        print(f"Удалена устаревшая задача: {old_task}")
    task_queue.append("Новая задача")
    return task_queue

tasks = deque(['task1', 'task2', 'task3'], maxlen=5)
print("До обработки:", list(tasks))
tasks = process_tasks(tasks, 5)
print("После обработки:", list(tasks))
До обработки: ['task1', 'task2', 'task3']
После обработки: ['task1', 'task2', 'task3', 'Новая задача']

Пример 2: Обход графа в ширину (BFS).

Пример python
from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    visited.add(start)
    order = []

    while queue:
        vertex = queue.popleft()
        order.append(vertex)
        for neighbor in graph[vertex]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)
    return order

graph = {
    'A': ['B', 'C'],
    'B': ['D'],
    'C': ['E'],
    'D': [],
    'E': []
}
print("Порядок обхода BFS:", bfs(graph, 'A'))
Порядок обхода BFS: ['A', 'B', 'C', 'D', 'E']

Пример 3: Обработка скользящего окна.

Пример python
from collections import deque

def sliding_window_average(data, window_size):
    window = deque(maxlen=window_size)
    averages = []
    for value in data:
        window.append(value)
        if len(window) == window_size:
            avg = sum(window) / window_size
            averages.append(avg)
    return averages

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("Скользящее среднее:", sliding_window_average(data, 3))
Скользящее среднее: [2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

Аналоги в других языках программирования

PHP: Функция array_shift().

$arr = ['a', 'b', 'c'];
$item = array_shift($arr);
print_r($arr);
Array
(
    [0] => b
    [1] => c
)

JavaScript: Метод массива shift().

let arr = ['a', 'b', 'c'];
let item = arr.shift();
console.log(arr);
[ 'b', 'c' ]

Java: Метод poll() или remove() у интерфейса Deque.

Deque deque = new LinkedList<>();
deque.add("a");
deque.add("b");
String item = deque.pollFirst(); // или deque.poll()
System.out.println(deque);
[b]

C#: Метод Dequeue() у класса Queue.

Queue queue = new Queue();
queue.Enqueue("a");
queue.Enqueue("b");
string item = queue.Dequeue();
Console.WriteLine(string.Join(", ", queue));
b

Golang: Операции со срезами.

queue := []string{"a", "b", "c"}
item := queue[0]
queue = queue[1:]
fmt.Println(queue)
[b c]

В отличие от Python, во многих языках аналогичные функции могут вызывать исключение или возвращать специальное значение при пустой коллекции.

питон collections.deque.popleft function comments

En
Collections.deque.popleft Remove and return leftmost element