OrderedDictin, Pythonin järjestetyn sanakirjan käyttö.

liiketoiminta

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.

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.

  1. Luettele näkymäobjektit, jotka voidaan saada items()-menetelmällä käyttäen list()-menetelmää.
  2. Lisää avain-arvopareista koostuva tuple (avain, arvo) listan insert()-metodilla.
  3. 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ä.

  1. Luettele näkymäobjektit, jotka voidaan saada items()-menetelmällä käyttäen list()-menetelmää.
  2. Korvaa luettelon elementit
  3. 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)])
Copied title and URL