我在一个程序中发现了一个有趣的错误,我有点懒惰地执行,并想知道我是否正确理解它。简短版本是Python's heapq implementation实际上并没有排序列表,它只是以堆为中心的方式列出列表。具体而言,我期待heapify()产生一个有序列表,以有序的方式促进列表理解。使用Python的heapify()与列表理解和切片不兼容吗?
优先提示例如,Python的文档:
from heapq import heapify, heappush, heappop
from random import shuffle
class Item(object):
def __init__(self, name):
self.name = name
lst = []
# iterate over a pseudo-random list of unique numbers
for i in sample(range(100), 15):
it = Item("Some name for %i" % i)
heappush(lst, (i, it))
print([i[0] for i in lst])
结果
>>> [2, 22, 7, 69, 32, 40, 10, 97, 89, 33, 45, 51, 94, 27, 67]
此,我们注意到,不在列表的原排序,但显然一些以堆为中心的排序为described here。我正在懒洋洋地期待这完全订购。
作为测试,通过heapify()运行列表会导致没有变化(如列表已经堆ishly订购):
heapify(lst)
print([i[0] for i in lst])
>>> [2, 22, 7, 69, 32, 40, 10, 97, 89, 33, 45, 51, 94, 27, 67]
而通过与订货的heappop()功能结果的列表迭代预期:
lst2 = []
while lst: lst2.append(heappop(lst))
print([i[0] for i in lst2])
>>> [2, 7, 10, 22, 27, 32, 33, 40, 45, 51, 67, 69, 89, 94, 97]
因此,它似乎heapq不下令列表(至少在这个词的人的意义上),而是heappush()和heappop()功能能够饶有兴趣地列出堆。
结果:堆积列表上的任何切片和列表理解操作都会产生无序结果。
这是真的,这是总是是真的吗?
(顺便说一句:Python之3.0.1上的WinXP系统)