Python-diktionærer (objekter af typen dict) bevarer ikke rækkefølgen af elementer; CPython har gjort det siden 3.6, men det er implementeringsafhængigt og ubestemt i andre implementeringer; sprogspecifikationen har bevaret rækkefølgen siden 3.7.
OrderedDict findes i collections-modulet i standardbiblioteket som en ordbog, der bevarer rækkefølgen. Det er sikkert at bruge denne.
Importer modulet collections. Det er inkluderet i standardbiblioteket og behøver ikke at være installeret.
import collections
Hvis du skriver følgende, kan du udelade samlingerne. i de følgende eksempler.
from collections import OrderedDict
Nedenstående er en beskrivelse af, hvordan du bruger OrderedDict.
- Oprettelse af et OrderedDict-objekt
- OrderedDict er en underklasse af dict
- Flyt elementer til begyndelsen eller slutningen
- Tilføj et nyt element på en vilkårlig position.
- Omarrangere (reordne) elementer
- Sortere elementer efter nøgle eller værdi
Oprettelse af et OrderedDict-objekt
Konstruktøren collections.OrderedDict() kan bruges til at oprette et OrderedDict-objekt.
Opret et tomt OrderedDict-objekt, og tilføj værdier.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
Det er også muligt at angive argumenter til konstruktøren.
Du kan bruge nøgleordsargumenter, sekvenser af nøgle-værdipar (f.eks. tupler (nøgle, værdi)) osv. Sidstnævnte kan være en liste eller en tupel, så længe det er et nøgle-værdipar.
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)])
Indtil version 3.5 blev rækkefølgen af nøgleordsargumenter ikke bevaret, men siden version 3.6 er den nu bevaret.
Ændret i version 3.6: Med godkendelsen af PEP 468 bevares rækkefølgen af OrderedDict-konstruktøren og de nøgleordsargumenter, der overføres til update()-metoden.
collections — Container datatypes — Python 3.10.0 Documentation
Normale ordbøger (objekter af typen dict) kan også overføres til konstruktøren, men i tilfælde af implementationer, hvor dict-typen ikke bevarer rækkefølgen, vil den OrderedDict, der genereres fra den, heller ikke bevare rækkefølgen.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict er en underklasse af dict
OrderedDict er en underklasse af dict.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDict har også de samme metoder som dict, og metoderne til at hente, ændre, tilføje og fjerne elementer er de samme som 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)])
Se følgende artikel for yderligere oplysninger.
- Relaterede artikler:Tilføjelse af elementer til en ordbog og sammenføjning af ordbøger i Python
Flyt elementer til begyndelsen eller slutningen
Du kan bruge OrderedDict's egen metode move_to_end() til at flytte et element til begyndelsen eller slutningen.
Angiv nøglen som det første argument. Som standard flyttes den til slutningen, men hvis det andet argument sidste er false, flyttes den til begyndelsen.
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)])
Tilføj et nyt element på en vilkårlig position.
Det er muligt at oprette et nyt OrderedDict-objekt med et nyt element tilføjet på en vilkårlig position. Dette kan specifikt gøres på følgende måde.
- Liste over de visningsobjekter, der kan hentes med metoden items() ved hjælp af list().
- Tilføj en tupel (nøgle, værdi) af nøgle-værdipar i listens insert()-metode
- Opret et nyt objekt ved at overdrage det til konstruktøren 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() angiver den position, der skal indsættes som det første argument, og det element, der skal indsættes, som det andet argument.
I eksemplet tildeles et nyt objekt til den oprindelige variabel, og der tilføjes ingen nye elementer til selve det oprindelige objekt.
Omarrangere (reordne) elementer
Udskiftning af elementer er den samme proces som i eksemplet ovenfor.
- Liste over de visningsobjekter, der kan hentes med metoden items() ved hjælp af list().
- Udskift elementer i en liste
- Opret et nyt objekt ved at overdrage det til konstruktøren 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)])
Hvis du vil angive en nøgle og erstatte den, skal du bruge metoden index() til at hente indekset (positionen) fra listen over nøgler som vist nedenfor.
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)])
Sortere elementer efter nøgle eller værdi
Opret en liste over tupler (key, value) af sorterede nøgle-værdipar baseret på det visningsobjekt, der kan fås ved hjælp af metoden items(), og giv den til konstruktøren collections.OrderedDict() for at oprette et nyt objekt.
Sortering udføres ved at angive en anonym funktion (lambdaudtryk), der returnerer en nøgle eller værdi fra en tupel (nøgle, værdi) som argumentet nøgle for den indbyggede funktion sorted().
Hvis du vil vende rækkefølgen, skal du indstille reverse-argumentet i sorted() til 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)])