Pythonin sanakirjat (dict-tyyppiset objektit) eivät säilytä elementtien järjestystä; CPython on säilyttänyt sen 3.6:sta lähtien, mutta se on toteutuksesta riippuvainen ja epämääräinen muissa toteutuksissa; kielen spesifikaatio on säilyttänyt järjestyksen 3.7:stä lähtien.
OrderedDict on standardikirjaston collections-moduulin tarjoama sanakirja, joka säilyttää järjestyksen. Tätä on turvallista käyttää.
Tuo kokoelmat-moduuli. Se sisältyy standardikirjastoon, eikä sitä tarvitse asentaa.
import collections
Jos kirjoitat seuraavaa, voit jättää kokoelmat pois. seuraavissa esimerkeissä.
from collections import OrderedDict
Seuraavassa on kuvaus OrderedDictin käytöstä.
- OrderedDict-olion luominen
- OrderedDict on dictin aliluokka
- Siirrä elementtejä alkuun tai loppuun
- Lisää uusi elementti mihin tahansa kohtaan.
- Järjestä elementit uudelleen (uudelleenjärjestäminen)
- Lajittele elementit avaimen tai arvon mukaan
OrderedDict-olion luominen
Konstruktoria collections.OrderedDict() voidaan käyttää OrderedDict-olion luomiseen.
Luo tyhjä OrderedDict-olio ja lisää arvot.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
Konstruktorille on myös mahdollista määrittää argumentteja.
Voit käyttää avainsana-argumentteja, avain-arvoparien sarjoja (kuten tupleja (avain, arvo)) ja niin edelleen. Jälkimmäinen voi olla lista tai tuple, kunhan se on avain-arvopari.
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)])
Ennen versiota 3.5 avainsana-argumenttien järjestystä ei säilytetty, mutta versiosta 3.6 lähtien se on nyt säilytetty.
Muutettu versiossa 3.6: OrderedDict-konstruktorin ja update()-metodille annettujen avainsana-argumenttien järjestys säilyy PEP 468:n hyväksymisen myötä.
collections — Container datatypes — Python 3.10.0 Documentation
Konstruktorille voidaan antaa myös tavallisia sanakirjoja (dict-tyyppisiä objekteja), mutta toteutuksissa, joissa dict-tyyppi ei säilytä järjestystä, siitä generoitu OrderedDict ei myöskään säilytä järjestystä.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict on dictin aliluokka
OrderedDict on dictin alaluokka.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDictillä on myös samat metodit kuin dictillä, ja elementtien hakemiseen, muuttamiseen, lisäämiseen ja poistamiseen käytettävät metodit ovat samat kuin dictillä.
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)])
Katso lisätietoja seuraavasta artikkelista.
- Aiheeseen liittyvät artikkelit:Elementtien lisääminen sanakirjaan ja sanakirjojen yhdistäminen Pythonissa
Siirrä elementtejä alkuun tai loppuun
Voit käyttää OrderedDictin omaa metodia move_to_end() siirtääksesi elementin alkuun tai loppuun.
Määritä avain ensimmäiseksi argumentiksi. Oletusarvoisesti siirretään loppuun, mutta jos toinen argumentti last on false, se siirretään alkuun.
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)])
Lisää uusi elementti mihin tahansa kohtaan.
On mahdollista luoda uusi OrderedDict-olio, johon on lisätty uusi elementti mielivaltaiseen kohtaan. Tämä voidaan tehdä erityisesti seuraavalla tavalla.
- Luettele näkymäobjektit, jotka voidaan saada items()-menetelmällä käyttäen list()-menetelmää.
- Lisää avain-arvopareista koostuva tuple (avain, arvo) listan insert()-metodilla.
- Luo uusi objekti antamalla se konstruktorille 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() määrittää ensimmäisenä argumenttina lisättävän paikan ja toisena argumenttina lisättävän elementin.
Esimerkissä alkuperäinen muuttuja saa uuden objektin, eikä alkuperäiseen objektiin lisätä uusia elementtejä.
Järjestä elementit uudelleen (uudelleenjärjestäminen)
Elementtien vaihtaminen on sama prosessi kuin yllä olevassa esimerkissä.
- Luettele näkymäobjektit, jotka voidaan saada items()-menetelmällä käyttäen list()-menetelmää.
- Korvaa luettelon elementit
- Luo uusi objekti antamalla se konstruktorille 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)])
Jos haluat määrittää avaimen ja korvata sen, käytä index()-metodia saadaksesi indeksin (sijainnin) avainten luettelosta alla esitetyllä tavalla.
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)])
Lajittele elementit avaimen tai arvon mukaan
Luo lista tupleista (avain, arvo), jotka koostuvat lajitelluista avain-arvopareista, jotka perustuvat metodilla items() saatavaan view-objektiin, ja luovuta se konstruktorille collections.OrderedDict() uuden objektin luomiseksi.
Lajittelu suoritetaan määrittämällä anonyymi funktio (lambda-lauseke), joka palauttaa avaimen tai arvon tuplasta (avain, arvo), joka on sisäänrakennetun funktion sorted() argumenttina avain.
Jos haluat kääntää järjestyksen päinvastaiseksi, aseta sorted():n käänteisargumentiksi 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)])