Python heapq:如何使用列表列表的第n个元素对堆进行排序?

时间:2017-08-26 06:50:55

标签: python

所以我将列表添加到堆中;例如:

 n = [[1, 5, 93],
     [2, 6, 44],
     [4, 7, 45],
     [6, 3, 12]]

 heapq.heapify(n)
 print(n)

根据列表的第一个元素进行比较和排序。

我的问题是,如何对heapq进行排序,以便比较每个列表的第三个元素?例如,将按以下顺序从heapq访问上面的列表:

[[6, 3, 12],
 [2, 6, 44],
 [4, 7, 45],
 [1, 5, 93]]

1 个答案:

答案 0 :(得分:4)

heapq不支持key函数进行排序,因此您需要操作数据结构。将您的列表映射到tuple(sort_value, list)将允许您执行log(n)推送和弹出:

 In []:
 q = [(x[2], x) for x in n]
 heapq.heapify(q)
 heapq.heappop(q)

 Out[]:
 (12, [6, 3, 12])

 In []:
 l = [2, 5, 1]
 heapq.heappush(q, (l[2], l))
 heapq.heappop(q)

 Out[]:
 (1, [2, 5, 1])

或者,定义您自己的list并实现该列表的比较函数:

class MyList(list):
    def __lt__(self, other):
        return self[2] < other[2]

q = [MyList(x) for x in n]

注意:您应该实现其他比较功能(有关如何轻松完成此操作,请参阅functools.total_ordering。)