Ich fand einen interessanten Fehler in einem Programm, das ich etwas träge implementierte, und fragte mich, ob ich es richtig verstehe. Die kurze Version ist, dass Python's heapq
implementation nicht wirklich eine Liste bestellt, sondern lediglich die Liste auf eine Heap-zentrierte Weise gruppiert. Insbesondere erwartete ich, dass heapify()
zu einer geordneten Liste führte, die das Listenverständnis in geordneter Weise erleichterte.Kann Pythons Heapify() nicht gut mit Listenverständnis und Slicing spielen?
eine Priorität Stichwort Beispiel verwenden, wie in der Python-Dokumentation:
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])
Ergebnisse in
>>> [2, 22, 7, 69, 32, 40, 10, 97, 89, 33, 45, 51, 94, 27, 67]
Diese stellen wir fest, ist nicht die Original Reihenfolge der Liste, aber anscheinend einige Heap-zentrische Reihenfolge wie . Ich habe träge erwartet, dass dies vollständig bestellt wird.
Als Test die Liste durch heapify läuft() führt zu keiner Veränderung (wie die Liste bereits heap-ishly bestellt ist):
heapify(lst)
print([i[0] for i in lst])
>>> [2, 22, 7, 69, 32, 40, 10, 97, 89, 33, 45, 51, 94, 27, 67]
Während bei den heappop()
Funktion Ergebnisse bei der Bestellung durch die Liste iterieren wie erwartet:
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]
so würde es scheinen, dass heapq
keine Liste nicht bestellt werden (zumindest im menschlichen Sinne des Wortes), sondern die heappush()
und heappop()
Funktionen sind in der Lage grok die heap-ishly geordnete Liste.
Das Ergebnis: Alle Operationen zum Schneiden und Listenverstehen in einer Liste führen zu nicht geordneten Ergebnissen.
Ist das wahr, und ist das immer wahr?
(BTW: Python 3.0.1 auf einem WinXP System)
Ja, ich habe es meistens gepostet, so dass es verfügbar wäre, wenn jemand anderes das gleiche Problem hätte, aber es ist gut zu wissen, dass ich diese Dokumente falsch verstanden habe und sie deutlicher gelesen haben sollte. – JohnMetta