Python rječnici (objekti tipa dict) ne čuvaju redoslijed elemenata; CPython to čini od 3.6, ali ovisi o implementaciji i neodređen je u drugim implementacijama; jezična specifikacija je sačuvala poredak od 3.7.
OrderedDict se nalazi u modulu zbirki standardne biblioteke kao rječnik koji čuva redoslijed. Ovo je sigurno koristiti.
Uvezite modul zbirki. Uključen je u standardnu biblioteku i nije ga potrebno instalirati.
import collections
Ako napišete sljedeće, možete izostaviti zbirke. u sljedećim primjerima.
from collections import OrderedDict
Slijedi opis kako koristiti OrderedDict.
- Stvaranje OrderedDict objekta
- OrderedDict je podklasa dict
- Premjestite elemente na početak ili kraj
- Dodajte novi element na bilo koju poziciju.
- Preurediti (preurediti) elemente
- Poredaj elemente po ključu ili vrijednosti
Stvaranje OrderedDict objekta
Konstruktor collections.OrderedDict() može se koristiti za stvaranje OrderedDict objekta.
Napravite prazan objekt OrderedDict i dodajte vrijednosti.
od = collections.OrderedDict()
od['k1'] = 1
od['k2'] = 2
od['k3'] = 3
print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
Također je moguće specificirati argumente konstruktoru.
Možete koristiti argumente ključne riječi, nizove parova ključ/vrijednost (kao što su torke (ključ, vrijednost)) i tako dalje. Potonji može biti popis ili tuple sve dok se radi o paru ključ/vrijednost.
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 verzije 3.5 redoslijed argumenata ključnih riječi nije sačuvan, ali od verzije 3.6 sada je sačuvan.
Promijenjeno u verziji 3.6: S prihvaćanjem PEP 468, redoslijed konstruktora OrderedDict i argumenata ključne riječi proslijeđenih metodi update() je sačuvan.
collections — Container datatypes — Python 3.10.0 Documentation
Normalni rječnici (objekti tipa dict) također se mogu proslijediti konstruktoru, ali u slučaju implementacija gdje tip dict ne čuva redoslijed, OrderedDict generiran iz njega također neće sačuvati red.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict je podklasa dict
OrderedDict je podklasa dict.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDict također ima iste metode kao dict, a metode za dobivanje, promjenu, dodavanje i uklanjanje elemenata su iste kao i 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)])
Za detalje pogledajte sljedeći članak.
- Povezani članci:Dodavanje elemenata u rječnik i spajanje rječnika u Pythonu
Premjestite elemente na početak ili kraj
Možete koristiti vlastitu metodu OrderedDict move_to_end() da premjestite element na početak ili kraj.
Navedite ključ kao prvi argument. Zadano je pomicanje na kraj, ali ako je zadnji argument netočan, bit će premješten na početak.
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)])
Dodajte novi element na bilo koju poziciju.
Moguće je stvoriti novi OrderedDict objekt s novim elementom dodanim na proizvoljnom mjestu. Točnije, to se može učiniti u sljedećem tijeku.
- Navedite objekte pogleda koji se mogu dobiti metodom items() pomoću liste().
- Dodajte tuple (ključ, vrijednost) parova ključ/vrijednost u metodu insert() popisa
- Stvorite novi objekt proslijeđujući ga konstruktoru 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() specificira poziciju koja će se umetnuti kao prvi argument, a element koji će se umetnuti kao drugi argument.
U primjeru, novi objekt je dodijeljen izvornoj varijabli, a samom izvornom objektu se ne dodaju novi elementi.
Preurediti (preurediti) elemente
Zamjena elemenata je isti postupak kao u gornjem primjeru.
- Navedite objekte pogleda koji se mogu dobiti metodom items() pomoću liste().
- Zamijenite elemente na popisu
- Stvorite novi objekt proslijeđujući ga konstruktoru 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)])
Ako želite odrediti ključ i zamijeniti ga, koristite metodu index() da biste dobili indeks (poziciju) s popisa ključeva kao što je prikazano u nastavku.
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)])
Poredaj elemente po ključu ili vrijednosti
Izradite popis torki (ključ, vrijednost) sortiranih parova ključ/vrijednost na temelju objekta pogleda koji se može dobiti metodom items() i proslijedite ga konstruktoru collections.OrderedDict() kako biste stvorili novi objekt.
Sortiranje se izvodi specificiranjem anonimne funkcije (lambda izraz) koja vraća ključ ili vrijednost iz tuple (ključ, vrijednost) kao ključ argumenta ugrađene funkcije sorted().
Ako želite obrnuti redoslijed, postavite obrnuti argument 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)])