例如,我有一个包含子列表的列表:
a = [[1,83],[2,7],[3,10]]
我想根据子列表的第二个元素创建一个优先级队列,这意味着如果我使用
a.pop()
输出
[2,7]
因为它具有最小的第二个元素。
答案 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")
在此排序列表的末尾为您提供预期的输出。