Hoe gebruik je OrderedDict, een Python geordend woordenboek.

Bedrijf

Python woordenboeken (objecten van het type dict) behouden de volgorde van de elementen niet; CPython doet dit sinds 3.6, maar het is implementatie-afhankelijk en onbepaald in andere implementaties; de taalspecificatie bewaart de volgorde sinds 3.7.

OrderedDict wordt in de collections module van de standaard bibliotheek aangeboden als een dictionary die de volgorde bewaart. Het is veilig om deze te gebruiken.

Importeer de collections module. Deze is opgenomen in de standaard bibliotheek en hoeft niet geïnstalleerd te worden.

import collections

Als u het volgende schrijft, kunt u de verzamelingen weglaten. in de volgende voorbeelden.

from collections import OrderedDict

Hieronder volgt een beschrijving van het gebruik van OrderedDict.

  • Aanmaken van een object OrderedDict
  • OrderedDict is een subklasse van dict
  • Verplaats elementen naar het begin of einde
  • Voeg een nieuw element toe op een willekeurige positie.
  • Herschikken (herordenen) van elementen
  • Sorteer elementen op sleutel of waarde

Aanmaken van een object OrderedDict

De constructor collections.OrderedDict() kan worden gebruikt om een OrderedDict object te maken.

Maak een leeg OrderedDict object en voeg waarden toe.

od = collections.OrderedDict()

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

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

Het is ook mogelijk om argumenten aan de constructor mee te geven.

U kunt trefwoordargumenten gebruiken, reeksen van sleutel-waardeparen (zoals tupels (sleutel, waarde)), enzovoort. Dit laatste kan een lijst of een tupel zijn, zolang het maar een sleutel-waarde paar is.

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)])

Tot versie 3.5 werd de volgorde van de trefwoordargumenten niet bewaard, maar sinds versie 3.6 is dat nu wel het geval.

Veranderd in versie 3.6: Met de acceptatie van PEP 468, wordt de volgorde van de OrderedDict constructor en de keyword argumenten doorgegeven aan de update() methode behouden.
collections — Container datatypes — Python 3.10.0 Documentation

Normale woordenboeken (objecten van het type dict) kunnen ook aan de constructor worden doorgegeven, maar in het geval van implementaties waar het type dict geen orde bewaart, zal het OrderedDict dat daaruit wordt gegenereerd ook geen orde bewaren.

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

OrderedDict is een subklasse van dict

OrderedDict is een subklasse van dict.

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

Ook OrderedDict heeft dezelfde methodes als dict, en de methodes voor het krijgen, veranderen, toevoegen en verwijderen van elementen zijn dezelfde als 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)])

Zie het volgende artikel voor details.

Verplaats elementen naar het begin of einde

Je kunt OrderedDict's eigen methode move_to_end() gebruiken om een element naar het begin of het einde te verplaatsen.

Geef de sleutel op als eerste argument. De standaardinstelling is om naar het einde te gaan, maar als het tweede argument laatste vals is, zal het naar het begin worden verplaatst.

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)])

Voeg een nieuw element toe op een willekeurige positie.

Het is mogelijk om een nieuw OrderedDict object te maken met een nieuw element toegevoegd op een willekeurige positie. Concreet kan dit gedaan worden in de volgende flow.

  1. Maak een lijst van de view objecten die kunnen worden verkregen met de items() methode met behulp van list().
  2. Voeg een tupel (sleutel, waarde) van sleutel-waardeparen toe in de insert() methode van de lijst
  3. Maak een nieuw object door het door te geven aan de constructor collections.OrderedDict()
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() specificeert de in te voegen positie als het eerste argument, en het in te voegen element als het tweede argument.

In het voorbeeld wordt een nieuw object toegewezen aan de oorspronkelijke variabele, en worden geen nieuwe elementen toegevoegd aan het oorspronkelijke object zelf.

Herschikken (herordenen) van elementen

Het vervangen van elementen gaat op dezelfde manier als in het voorbeeld hierboven.

  1. Maak een lijst van de view objecten die kunnen worden verkregen met de items() methode met behulp van list().
  2. Elementen in een lijst vervangen
  3. Maak een nieuw object door het door te geven aan de constructor collections.OrderedDict()
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)])

Als je een sleutel wilt specificeren en vervangen, gebruik dan de index() methode om de index (positie) uit de lijst van sleutels te halen, zoals hieronder getoond.

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)])

Sorteer elementen op sleutel of waarde

Maak een lijst van tupels (sleutel, waarde) van gesorteerde sleutel-waarde paren op basis van het view object dat kan worden verkregen met de items() methode, en geef het door aan de constructor collections.OrderedDict() om een nieuw object te maken.

Sorteren wordt uitgevoerd door een anonieme functie (lambda expressie) te specificeren die een sleutel of waarde teruggeeft van een tupel (sleutel, waarde) als argument sleutel van de ingebouwde functie sorted().

Als je de volgorde wilt omkeren, zet dan het reverse argument van sorted() op 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)])