Frage

Ich versuche, ein dict auf seinen Schlüssel zu sortieren und einen Iterator auf die Werte innerhalb eines überschriebenen iter Verfahrens in einer Klasse zurück. Gibt es eine schönere und effizientere Art und Weise, dies zu tun, als eine neue Liste erstellen, das Einfügen in die Liste, wie ich Art über die Tasten?

War es hilfreich?

Lösung

Wie wäre es etwa so:

def itersorted(d):
    for key in sorted(d):
        yield d[key]

Andere Tipps

Bei weitem die einfachste Ansatz, und mit ziemlicher Sicherheit die schnellste, ist etwas entlang der Linien von:

def sorted_dict(d):
    keys = d.keys()
    keys.sort()
    for key in keys:
        yield d[key]

Sie können nicht sortieren, ohne alle Schlüssel zu holen. Das Abrufen alle Schlüssel in eine Liste und dann diese Liste Sortierung ist der effizienteste Weg, dies zu tun; Liste Sortierung ist sehr schnell, und wie, dass die Schlüssel-Liste holen ist, so schnell wie es sein kann. Anschließend können Sie erstellen entweder eine neue Liste von Werten oder die Werte ergeben, wie das Beispiel der Fall ist. Denken Sie daran, dass Sie nicht die dict ändern können, wenn Sie über sie iterieren (die nächste Iteration fehlschlagen würde) so, wenn Sie die dict ändern möchten, bevor Sie mit dem Ergebnis der sorted_dict getan (), machen sie eine Liste zurück .

def sortedDict(dictobj):
    return (value for key, value in sorted(dictobj.iteritems()))

Dies wird eine einzige Zwischen Liste erstellen, die ‚sortiert ()‘ Methode gibt eine reale Liste. Aber zumindest ist es nur einer.

Angenommen, Sie eine Standardsortierreihenfolge möchten, können Sie sortiert verwendet (Liste) oder List.Sort (). Wenn Sie Ihre eigene Art Logik wollen, unterstützen Python-Listen die Möglichkeit, auf der Grundlage einer Funktion, die Sie in geben sortieren. Zum Beispiel wäre folgendes ein Weg sein, Zahlen sortieren von gelinde größten (das Standardverhalten) mit einer Funktion.

def compareTwo(a, b):
  if a > b:
    return 1
  if a == b:
    return 0
  if a < b:
    return -1

List.Sort(compareTwo)
print a

Dieser Ansatz ist konzeptionell ein bisschen sauberer als manuell eine neue Liste erstellen und Anhängen der neuen Werte und können Sie die Sortierlogik steuern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top