在Python3中,如何基于其子列表的第二个元素创建优先级队列

时间:2016-11-11 00:08:43

标签: python python-3.x

例如,我有一个包含子列表的列表:

a = [[1,83],[2,7],[3,10]]

我想根据子列表的第二个元素创建一个优先级队列,这意味着如果我使用

a.pop()

输出

[2,7]

因为它具有最小的第二个元素。

3 个答案:

答案 0 :(得分:2)

子类化内置列表:

>>> import gc
>>> 
>>> def mypop(list_, index=None):
...     if index is None:
...         try:
...             index = min(enumerate(list_), key=lambda x: x[1][1])[0]
...         except ValueError:
...             # allow for empty lists
...             pass
...     args = () if index is None else (index,)
...     return list_.pop(*args)
... 
>>> gc.get_referents(list.__dict__)[0]["mypop"] = mypop
>>> 
>>> L = [[1,83],[2,7],[3,10]]
>>> L.mypop()
[2, 7]
>>> L.mypop()
[3, 10]
>>> L.mypop()
[1, 83]
>>> L.mypop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in mypop
IndexError: pop from empty list

直接在内置列表而不是自定义类上运行的Hack方式:

>>> a = [[1,83],[2,7],[3,10]]
>>> a.sort(key=lambda x: x[1], reverse=True)
>>> a.pop()
[2,7]

^嘿,不要使用此,我只是在这里发布以获取乐趣!

答案 1 :(得分:1)

每当我完成此操作时,我发现将要排序的值拉出到元组的第一个元素中,以便在优先级队列中使用是很有用的。当你有一个数据列表时,它会特别有用,并且你想通过一个适应性函数来推送它,以便在你构建它时获得一个排序列表(按堆属性排序)。

其他答案基本上是告诉您对列表进行排序。但是,如果您要生成列表,那么将列表保持优先顺序会很有用,因为插入是平均情况O(1)。如果您正在运行实时应用程序(例如游戏),并且需要在特定时间内返回最佳结果,您可以运行模拟,存储结果,并在达到超时时,第一个元素队列将是最低优先级,没有额外的排序。

import heapq
a = [[1,83],[2,7],[3,10]]
my_queue = []
for item in a:
  # assume that in this case, the item is calculated rather than just pulled from list a
  heapq.heappush(my_queue,(a[1],a))

my_queue对象现在包含排序值的元组和按heap属性排序的原始列表。你可以按顺序弹出它们:

while my_queue:
  heapq.heappop(my_queue)

结果:

>> (7, [2, 7])
>> (10, [3, 10])
>> (83, [1, 83])

答案 2 :(得分:0)

pop

这将根据每个子列表中的第二个值按相反顺序对列表进行排序。然后Sys.getenv("HOME")在此排序列表的末尾为您提供预期的输出。