我正在为大学开发一个项目。我有一个对象Node的有序列表,我想在其属性node.evaluation_function的基础上,在正确的位置插入一个节点。
此刻,每当我插入一个新节点时,便以这种方式对列表进行排序:
queue.append(node)
queue.sort(key=lambda x: x.evaluation_function)
但是我认为这个方法太慢了,因为它在每次新插入时都会重新排序列表。 有没有一种方法可以将对象立即插入正确的位置?
答案 0 :(得分:2)
一种干净的方法是使这些node
对象具有可比性,并使用the bisect
base-library中的insort
功能。
from bisect import insort
class Node:
def __init__(self, x):
self.val = x
def evaluation_function(self):
return self.val
def __lt__(self, other):
return self.evaluation_function() < other.evaluation_function()
my_list = [Node(4), Node(6), Node(9)]
insort(my_list, Node(5))
print([n.val for n in my_list])
输出:
[4, 5, 6, 9]
通过定义__lt__(self, other)
函数,我们可以使此类具有可比性。然后,我们可以使用漂亮的insort
函数在保持顺序的同时进行插入。