Wie man OrderedDict, ein geordnetes Python-Wörterbuch, verwendet.

Geschäft

Python-Dictionaries (Objekte vom Typ dict) behalten die Reihenfolge der Elemente nicht bei; CPython tut dies seit 3.6, aber es ist implementierungsabhängig und in anderen Implementierungen unbestimmt; die Sprachspezifikation hat die Reihenfolge seit 3.7 beibehalten.

OrderedDict wird im Collections-Modul der Standardbibliothek als ein Wörterbuch bereitgestellt, das die Reihenfolge beibehält. Es ist sicher, dieses zu verwenden.

Importieren Sie das Modul collections. Es ist in der Standardbibliothek enthalten und muss nicht installiert werden.

import collections

Wenn Sie das Folgende schreiben, können Sie die Sammlungen weglassen. in den folgenden Beispielen.

from collections import OrderedDict

Im Folgenden wird beschrieben, wie das OrderedDict verwendet wird.

  • Erstellen eines OrderedDict-Objekts
  • OrderedDict ist eine Unterklasse von dict
  • Elemente an den Anfang oder das Ende verschieben
  • Fügen Sie ein neues Element an einer beliebigen Stelle ein.
  • Elemente neu anordnen (reorder)
  • Elemente nach Schlüssel oder Wert sortieren

Erstellen eines OrderedDict-Objekts

Der Konstruktor collections.OrderedDict() kann verwendet werden, um ein OrderedDict-Objekt zu erstellen.

Erstellen Sie ein leeres OrderedDict-Objekt und fügen Sie Werte hinzu.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Es ist auch möglich, Argumente für den Konstruktor anzugeben.

Sie können Schlüsselwortargumente, Sequenzen von Schlüssel-Wert-Paaren (wie Tupel (Schlüssel, Wert)) usw. verwenden. Letzteres kann eine Liste oder ein Tupel sein, solange es ein Schlüssel-Wert-Paar ist.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Bis Version 3.5 wurde die Reihenfolge der Schlüsselwortargumente nicht beibehalten, aber seit Version 3.6 wird sie nun beibehalten.

Geändert in Version 3.6: Mit der Annahme von PEP 468 wird die Reihenfolge des OrderedDict-Konstruktors und der Schlüsselwortargumente, die an die update()-Methode übergeben werden, beibehalten.
collections — Container datatypes — Python 3.10.0 Documentation

Normale Dictionaries (Objekte vom Typ dict) können ebenfalls an den Konstruktor übergeben werden, aber im Falle von Implementierungen, bei denen der Typ dict die Reihenfolge nicht beibehält, wird auch das daraus erzeugte OrderedDict die Reihenfolge nicht beibehalten.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict ist eine Unterklasse von dict

OrderedDict ist eine Unterklasse von dict.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict hat auch die gleichen Methoden wie dict, und die Methoden zum Erhalten, Ändern, Hinzufügen und Entfernen von Elementen sind die gleichen wie bei dict.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Weitere Informationen finden Sie im folgenden Artikel.

Elemente an den Anfang oder das Ende verschieben

Sie können die eigene Methode move_to_end() von OrderedDict verwenden, um ein Element an den Anfang oder an das Ende zu verschieben.

Geben Sie den Schlüssel als erstes Argument an. Standardmäßig wird der Schlüssel an das Ende verschoben, aber wenn das zweite Argument false ist, wird er an den Anfang verschoben.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Fügen Sie ein neues Element an einer beliebigen Stelle ein.

Es ist möglich, ein neues OrderedDict-Objekt zu erstellen, dem ein neues Element an einer beliebigen Position hinzugefügt wird. Konkret kann dies in der folgenden Reihenfolge geschehen.

  1. Auflistung der View-Objekte, die mit der Methode items() unter Verwendung von list() abgerufen werden können.
  2. Hinzufügen eines Tupels (Schlüssel, Wert) von Schlüssel-Wert-Paaren in der insert()-Methode der Liste
  3. Erstellen Sie ein neues Objekt, indem Sie es an den Konstruktor collections.OrderedDict() übergeben.
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

insert() gibt die einzufügende Position als erstes Argument und das einzufügende Element als zweites Argument an.

In diesem Beispiel wird der ursprünglichen Variable ein neues Objekt zugewiesen, während dem ursprünglichen Objekt selbst keine neuen Elemente hinzugefügt werden.

Elemente neu anordnen (reorder)

Das Ersetzen von Elementen ist derselbe Prozess wie im obigen Beispiel.

  1. Auflistung der View-Objekte, die mit der Methode items() unter Verwendung von list() abgerufen werden können.
  2. Ersetzen von Elementen in einer Liste
  3. Erstellen Sie ein neues Objekt, indem Sie es an den Konstruktor collections.OrderedDict() übergeben.
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

Wenn Sie einen Schlüssel angeben und ihn ersetzen wollen, verwenden Sie die Methode index(), um den Index (die Position) aus der Liste der Schlüssel zu erhalten, wie unten gezeigt.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

Elemente nach Schlüssel oder Wert sortieren

Erstellen Sie eine Liste von Tupeln (Schlüssel, Wert) von sortierten Schlüssel-Wert-Paaren auf der Grundlage des View-Objekts, das mit der Methode items() erhalten werden kann, und übergeben Sie diese an den Konstruktor collections.OrderedDict(), um ein neues Objekt zu erstellen.

Die Sortierung erfolgt durch Angabe einer anonymen Funktion (Lambda-Ausdruck), die einen Schlüssel oder einen Wert aus einem Tupel (Schlüssel, Wert) als Argument key der eingebauten Funktion sorted() zurückgibt.

Wenn Sie die Reihenfolge umkehren wollen, setzen Sie das Argument reverse von sorted() auf true.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])