Kako uporabljati OrderedDict, urejen slovar v jeziku Python.

Posel

Pythonovi slovarji (objekti tipa dict) ne ohranjajo vrstnega reda elementov; CPython to počne od različice 3.6, v drugih izvedbah pa je to odvisno od izvedbe in nedoločljivo; specifikacija jezika ohranja vrstni red od različice 3.7.

OrderedDict je na voljo v modulu zbirke standardne knjižnice kot slovar, ki ohranja vrstni red. Uporaba tega slovarja je varna.

Uvozite modul zbirke. Modul je vključen v standardno knjižnico in ga ni treba namestiti.

import collections

Če napišete naslednje, lahko v naslednjih primerih izpustite zbirke.

from collections import OrderedDict

V nadaljevanju je opis, kako uporabljati OrderedDict.

  • Ustvarjanje objekta OrderedDict
  • OrderedDict je podrazred razreda dict
  • premikanje elementov na začetek ali konec
  • Dodajanje novega elementa na poljubno mesto.
  • Preoblikovanje (preureditev) elementov
  • Razvrsti elemente po ključu ali vrednosti

Ustvarjanje objekta OrderedDict

S konstruktorjem collections.OrderedDict() lahko ustvarite objekt OrderedDict.

Ustvarite prazen objekt OrderedDict in dodajte vrednosti.

od = collections.OrderedDict()

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

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

Konstruktorju je mogoče navesti tudi argumente.

Uporabite lahko argumente s ključnimi besedami, zaporedja parov ključ-vrednost (kot so tuple (ključ, vrednost)) itd. Slednji je lahko seznam ali tuple, če gre za par ključ-vrednost.

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

Do različice 3.5 se vrstni red argumentov ključnih besed ni ohranjal, od različice 3.6 pa se zdaj ohranja.

Spremenjeno v različici 3.6: S sprejetjem PEP 468 je ohranjen vrstni red konstruktorja OrderedDict in argumentov ključnih besed, posredovanih metodi update().
collections — Container datatypes — Python 3.10.0 Documentation

Konstruktorju je mogoče posredovati tudi običajne slovarje (predmete tipa dict), vendar v primeru implementacij, kjer tip dict ne ohranja vrstnega reda, iz njega ustvarjeni OrderedDict prav tako ne bo ohranil vrstnega reda.

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

OrderedDict je podrazred razreda dict

OrderedDict je podrazred razreda dict.

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

Tudi OrderedDict ima enake metode kot dict, metode za pridobivanje, spreminjanje, dodajanje in odstranjevanje elementov pa so enake kot pri 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)])

Podrobnosti najdete v naslednjem članku.

premikanje elementov na začetek ali konec

Za premik elementa na začetek ali konec lahko uporabite lastno metodo OrderedDict move_to_end().

Kot prvi argument navedite ključ. Privzeto se premakne na konec, če pa je drugi argument false, se premakne na začetek.

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

Dodajanje novega elementa na poljubno mesto.

Ustvariti je mogoče nov objekt OrderedDict z novim elementom, dodanim na poljubno mesto. To je mogoče storiti z naslednjim postopkom.

  1. Naštejte predmete pogleda, ki jih lahko dobite z metodo items() z uporabo funkcije list().
  2. Dodajanje dvojice (ključ, vrednost) parov ključ-vrednost v metodi insert() seznama
  3. Ustvarite nov objekt tako, da ga posredujete konstruktorju 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)])

funkcija insert() kot prvi argument navede položaj, ki ga je treba vstaviti, kot drugi argument pa element, ki ga je treba vstaviti.

V tem primeru je prvotni spremenljivki dodeljen nov objekt, prvotnemu objektu pa niso dodani nobeni novi elementi.

Preoblikovanje (preureditev) elementov

Zamenjava elementov je enak postopek kot v zgornjem primeru.

  1. Naštejte predmete pogleda, ki jih lahko dobite z metodo items() z uporabo funkcije list().
  2. Zamenjava elementov na seznamu
  3. Ustvarite nov objekt tako, da ga posredujete konstruktorju 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)])

Če želite določiti ključ in ga zamenjati, uporabite metodo index() za pridobitev indeksa (položaja) s seznama ključev, kot je prikazano spodaj.

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

Razvrsti elemente po ključu ali vrednosti

Ustvari seznam nizov (ključ, vrednost) razvrščenih parov ključ-vrednost na podlagi objekta pogleda, ki ga je mogoče pridobiti z metodo items(), in ga posreduje konstruktorju collections.OrderedDict(), da ustvari nov objekt.

Sortiranje izvedemo tako, da kot argument ključ vgrajene funkcije sorted() določimo anonimno funkcijo (izraz lambda), ki vrne ključ ali vrednost iz dvojice (ključ, vrednost).

Če želite obrniti vrstni red, nastavite argument reverse funkcije sorted() na 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)])
Copied title and URL