gpt4 book ai didi

python - 如何使用对象比较函数反转 heapq 堆中元素的顺序?

转载 作者:行者123 更新时间:2023-11-28 22:14:20 25 4
gpt4 key购买 nike

首先,我阅读了这个SO question但它实际上不包括我想要的方法。此外,否定实际值不适用于我的用例。

Heapq 文档:https://docs.python.org/3.6/library/heapq.html

假设我的堆中有一个数据类对象列表。只有 a属性决定对象的顺序。

import heapq
from dataclasses import dataclass

@dataclass
class C:
a: int
b: int
def __lt__(self, other):
return self.a < other.a

l=[C(2,1),C(9,109),C(2,4),C(9,4)]

print(heapq.heappop(l)) # C(a=2, b=1)
print(heapq.heappop(l)) # C(a=2, b=4)
print(heapq.heappop(l)) # C(a=9, b=109)
print(heapq.heappop(l)) # C(a=9, b=4)

现在我想要倒序。因此,我更改了行 return self.a < other.areturn self.a > other.a .结果:

import heapq
from dataclasses import dataclass

@dataclass
class C:
a: int
b: int
def __lt__(self, other):
return self.a > other.a

l=[C(2,1),C(9,109),C(2,4),C(9,4)]

print(heapq.heappop(l)) # C(a=2, b=1)
print(heapq.heappop(l)) # C(a=9, b=109)
print(heapq.heappop(l)) # C(a=9, b=4)
print(heapq.heappop(l)) # C(a=2, b=4)

期望的结果应该是四种解决方案之一:

C(a=9, b=109)   C(a=9, b=4)      C(a=9, b=109)  C(a=9, b=4)    
C(a=9, b=4) C(a=9, b=109) C(a=9, b=4) C(a=9, b=109)
C(a=2, b=1) C(a=2, b=1) C(a=2, b=4) C(a=2, b=4)
C(a=2, b=4) C(a=2, b=4) C(a=2, b=1) C(a=2, b=1)

可能不是所有的对象对都通过heapq 进行比较。这可以解释奇怪的顺序。但是,还有可能得到倒序吗?

是否必须提供更多的对象比较方法?

object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

如果您有完全不同的方法,请不要犹豫!

最佳答案

您需要使用 heapifyl 变成一个堆

from heapq import heapify, heappop
from dataclasses import dataclass

@dataclass
class C:
a: int
b: int
def __lt__(self, other):
return self.a > other.a

l=[C(2,1),C(9,109),C(2,4),C(9,4)]

heapify(l)

while l:
print(heappop(l))

打印

C(a=9, b=4)
C(a=9, b=109)
C(a=2, b=1)
C(a=2, b=4)

关于python - 如何使用对象比较函数反转 heapq 堆中元素的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53450056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com