Antworten:
Habe dies nicht sehr ausführlich getestet, funktioniert aber in Python 2.5.2.
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
Wenn Sie es gewohnt sind, for key, value in d.iteritems(): ...
anstelle von Iteratoren zu arbeiten, funktioniert dies weiterhin mit der obigen Lösung
>>> d = {"x":2, "h":15, "a":2222}
>>> for key, value in sorted(d.iteritems()):
>>> print(key, value)
('a', 2222)
('h', 15)
('x', 2)
>>>
Verwenden Sie in Python 3.x d.items()
anstelle von d.iteritems()
, um einen Iterator zurückzugeben.
items()
wird eine Liste erstellt und daher Speicher verwendet, während im iteritems()
Wesentlichen kein Speicher verwendet wird. Was zu verwenden ist, hängt hauptsächlich von der Größe des Wörterbuchs ab. Darüber hinaus 2to3
übernimmt das automatische Konvertierungstool Python 2 in Python 3 ( ) automatisch die Konvertierung von iteritems()
nach items()
, sodass Sie sich darüber keine Gedanken machen müssen.
collections.OrderedDict
dann sortieren Sie einmal und erhalten Artikel immer in sortierter Reihenfolge.
iteritems()
kein Speicher verwendet wird, muss alles in den Speicher gezogen werden sorted()
, damit es keinen Unterschied zwischen der Verwendung von items()
und iteritems()
hier in Bezug auf den Speicher gibt .
items()
items()
iteritems()
Verwenden Sie die sorted()
Funktion:
return sorted(dict.iteritems())
Wenn Sie einen tatsächlichen Iterator über die sortierten Ergebnisse wünschen, da sorted()
eine Liste zurückgegeben wird, verwenden Sie:
return iter(sorted(dict.iteritems()))
Die Schlüssel eines Diktats werden in einer Hashtabelle gespeichert, so dass dies ihre "natürliche Reihenfolge" ist, dh pseudozufällig. Jede andere Bestellung ist ein Konzept des Verbrauchers des Diktats.
sorted () gibt immer eine Liste zurück, kein Diktat. Wenn Sie ein dict.items () übergeben (das eine Liste von Tupeln erzeugt), wird eine Liste von Tupeln [(k1, v1), (k2, v2), ...] zurückgegeben, die in einer Schleife verwendet werden können in gewisser Weise wie ein Diktat, aber es ist sowieso kein Diktat !
foo = {
'a': 1,
'b': 2,
'c': 3,
}
print foo
>>> {'a': 1, 'c': 3, 'b': 2}
print foo.items()
>>> [('a', 1), ('c', 3), ('b', 2)]
print sorted(foo.items())
>>> [('a', 1), ('b', 2), ('c', 3)]
Das Folgende fühlt sich wie ein Diktat in einer Schleife an, ist es aber nicht, es ist eine Liste von Tupeln, die in k, v entpackt werden:
for k,v in sorted(foo.items()):
print k, v
Ungefähr gleichbedeutend mit:
for k in sorted(foo.keys()):
print k, foo[k]
sorted(foo.keys())
ist besser als das Äquivalent sorted(foo)
, da Wörterbücher ihre Schlüssel zurückgeben, wenn sie wiederholt werden (mit dem Vorteil foo.keys()
, dass sie möglicherweise nicht gezwungen werden, die Zwischenliste zu erstellen - je nachdem, wie sorted()
sie für iterable implementiert werden).
k in sorted(foo.keys()):
for k,v in sorted(foo.items()):
sorted(foo.keys())
Gregs Antwort ist richtig. Beachten Sie, dass Sie dies in Python 3.0 tun müssen
sorted(dict.items())
wie iteritems
wird weg sein.
Sie können jetzt auch OrderedDict
in Python 2.7 verwenden:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Hier haben Sie die neue Seite für die Version 2.7 und die OrderedDict-API .
Im Allgemeinen kann man ein Diktat so sortieren:
for k in sorted(d):
print k, d[k]
Fügen Sie für den speziellen Fall in der Frage mit einem "Drop-in-Replacement" für d.iteritems () eine Funktion wie die folgende hinzu:
def sortdict(d, **opts):
# **opts so any currently supported sorted() options can be passed
for k in sorted(d, **opts):
yield k, d[k]
und so ändert sich die Endzeile von
return dict.iteritems()
zu
return sortdict(dict)
oder
return sortdict(dict, reverse = True)
>>> import heapq
>>> d = {"c": 2, "b": 9, "a": 4, "d": 8}
>>> def iter_sorted(d):
keys = list(d)
heapq.heapify(keys) # Transforms to heap in O(N) time
while keys:
k = heapq.heappop(keys) # takes O(log n) time
yield (k, d[k])
>>> i = iter_sorted(d)
>>> for x in i:
print x
('a', 4)
('b', 9)
('c', 2)
('d', 8)
Diese Methode hat immer noch eine O (N log N) -Sortierung. Nach einem kurzen linearen Heapify werden die Elemente jedoch in sortierter Reihenfolge ausgegeben, was sie theoretisch effizienter macht, wenn Sie nicht immer die gesamte Liste benötigen.
Wenn Sie nach der Reihenfolge sortieren möchten, in der Elemente anstelle der Reihenfolge der Schlüssel eingefügt wurden, sollten Sie einen Blick auf Pythons Sammlungen werfen. OrderedDict . (Nur Python 3)
sortiert gibt eine Liste zurück, daher Ihr Fehler, wenn Sie versuchen, darüber zu iterieren. Da Sie jedoch kein Diktat bestellen können, müssen Sie sich mit einer Liste befassen.
Ich habe keine Ahnung, was der größere Kontext Ihres Codes ist, aber Sie könnten versuchen, der resultierenden Liste einen Iterator hinzuzufügen. so vielleicht?:
return iter(sorted(dict.iteritems()))
Natürlich werden Sie jetzt Tupel zurückbekommen, weil sortiert Ihr Diktat in eine Liste von Tupeln verwandelt hat
Beispiel: Sagen Sie, Ihr Diktat war:
{'a':1,'c':3,'b':2}
Sortiert verwandelt es in eine Liste:
[('a',1),('b',2),('c',3)]
Wenn Sie also tatsächlich über die Liste iterieren, erhalten Sie (in diesem Beispiel) ein Tupel zurück, das aus einer Zeichenfolge und einer Ganzzahl besteht, aber zumindest können Sie darüber iterieren.
Angenommen, Sie verwenden CPython 2.x und haben ein großes Wörterbuch mydict, dann wird die Verwendung von sortiert (mydict) langsam sein, da sortiert eine sortierte Liste der Schlüssel von mydict erstellt.
In diesem Fall sollten Sie sich mein bestelltes Dikt-Paket ansehen, das eine C-Implementierung von enthält sorteddict
in C enthält. Insbesondere, wenn Sie die sortierte Liste der Schlüssel in verschiedenen Phasen (dh Anzahl der Elemente) der Lebensdauer der Wörterbücher mehrmals durchgehen müssen.
.items()
anstelle voniteritems()
: Wie @Claudiu sagte, funktionieren Iteritems nicht für Python 3.x, sind jedochitems()
in Python 2.6 verfügbar.