Heapq в Python3 не работает с кортежами, поскольку он не соответствует порядку ожидания

Все говорят, если вы толкаете кортеж в heapq, он будет принимать первый аргумент в качестве фактора сравнения.

Но это не так! Мне интересно, что не так в моем коде?

for task_name, counter in tasks_counter.items():
    heappush(tasks_q, (-int(counter), task_name, counter))
heapify(tasks_q)
while tasks_q:
    print(tasks_q.pop())

выход

(-1, 'G', 1)
(-1, 'F', 1)
(-1, 'E', 1)
(-1, 'D', 1)
(-1, 'C', 1)
(-1, 'B', 1)
(-6, 'A', 6)

Я думаю, что я должен получить предмет со стоимостью A во-первых, верно? Но это не так.

Любое альтернативное решение использовать встроенную очередь приоритетов с Python?

Вывод другого примера.

1 ответ

Вы используете pop функция list, Вам нужно использовать heapq.heappop функция вместо Он будет корректировать список для поддержания инварианта кучи по пути. Смотрите основные примеры.

Также не нужно звонить heapify если вы начнете с [] и позвонить heappush несколько раз. heappush уже гарантирует, что инвариант кучи поддерживается.

Другие вопросы по тегам