Pythons ordböcker (objekt av typen dict) behåller inte ordningen på elementen; CPython har gjort det sedan 3.6, men det är implementationsberoende och obestämt i andra implementationer; språkspecifikationen har behållit ordningen sedan 3.7.
OrderedDict finns i collections-modulen i standardbiblioteket som en ordbok som bevarar ordningen. Det är säkert att använda denna.
Importera modulen för samlingar. Den ingår i standardbiblioteket och behöver inte installeras.
import collections
Om du skriver följande kan du utelämna samlingarna. i följande exempel.
from collections import OrderedDict
Nedan följer en beskrivning av hur du använder OrderedDict.
- Skapa ett OrderedDict-objekt
- OrderedDict är en underklass till dict
- Flytta element till början eller slutet
- Lägg till ett nytt element på valfri plats.
- Omordna (omordna) element
- Sortera element efter nyckel eller värde
Skapa ett OrderedDict-objekt
Konstruktören collections.OrderedDict() kan användas för att skapa ett OrderedDict-objekt.
Skapa ett tomt OrderedDict-objekt och lägg till värden.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
Det är också möjligt att ange argument till konstruktören.
Du kan använda nyckelordsargument, sekvenser av nyckel-värdepar (t.ex. tupler (nyckel, värde)) och så vidare. Det sistnämnda kan vara en lista eller en tupel så länge det är ett nyckel-värdepar.
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)])
Fram till version 3.5 sparades inte ordningsföljden för nyckelordsargument, men sedan version 3.6 sparas den nu.
Ändrad i version 3.6: Med godkännandet av PEP 468 bevaras ordningen i OrderedDict-konstruktören och de nyckelordsargument som skickas till update()-metoden.
collections — Container datatypes — Python 3.10.0 Documentation
Normala ordböcker (objekt av typen dict) kan också skickas till konstruktören, men om det finns implementationer där dict-typen inte bevarar ordningen kommer den OrderedDict som genereras från den inte heller att bevara ordningen.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict är en underklass till dict
OrderedDict är en underklass till dict.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDict har också samma metoder som dict, och metoderna för att hämta, ändra, lägga till och ta bort element är desamma som för 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öljande artikel för mer information.
- Relaterade artiklar:Lägga till element i en ordbok och sammanfoga ordböcker i Python
Flytta element till början eller slutet
Du kan använda OrderedDicts egen metod move_to_end() för att flytta ett element till början eller slutet.
Ange nyckeln som första argument. Standardvärdet är att flytta till slutet, men om det andra argumentet last är falskt flyttas det till början.
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)])
Lägg till ett nytt element på valfri plats.
Det är möjligt att skapa ett nytt OrderedDict-objekt med ett nytt element som läggs till på en godtycklig position. Detta kan göras på följande sätt.
- Lista de visningsobjekt som kan erhållas med metoden items() med hjälp av list().
- Lägg till en tupel (nyckel, värde) av nyckel-värdepar i listans insert()-metod.
- Skapa ett nytt objekt genom att skicka det till 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() anger den position som ska infogas som första argument och det element som ska infogas som andra argument.
I exemplet tilldelas ett nytt objekt till den ursprungliga variabeln och inga nya element läggs till i själva det ursprungliga objektet.
Omordna (omordna) element
Att byta ut element är samma process som i exemplet ovan.
- Lista de visningsobjekt som kan erhållas med metoden items() med hjälp av list().
- Ersätta element i en lista
- Skapa ett nytt objekt genom att skicka det till 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)])
Om du vill ange en nyckel och ersätta den använder du metoden index() för att hämta indexet (positionen) från listan över nycklar enligt nedan.
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)])
Sortera element efter nyckel eller värde
Skapa en lista med tupler (key, value) med sorterade nyckel-värdepar baserat på vyobjektet som kan erhållas med metoden items(), och skicka den till konstruktören collections.OrderedDict() för att skapa ett nytt objekt.
Sortering utförs genom att ange en anonym funktion (lambdauttryck) som returnerar en nyckel eller ett värde från en tupel (nyckel, värde) som argumentet nyckel för den inbyggda funktionen sorted().
Om du vill vända på ordningen ställer du in det omvända argumentet i sorted() till 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)])