根据对象的属性将对象插入到有序列表中

时间:2019-02-19 10:52:10

标签: python

我正在为大学开发一个项目。我有一个对象Node的有序列表,我想在其属性node.evaluation_function的基础上,在正确的位置插入一个节点。

此刻,每当我插入一个新节点时,便以这种方式对列表进行排序:

queue.append(node)
queue.sort(key=lambda x: x.evaluation_function)

但是我认为这个方法太慢了,因为它在每次新插入时都会重新排序列表。 有没有一种方法可以将对象立即插入正确的位置?

1 个答案:

答案 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函数在保持顺序的同时进行插入。