Kako koristiti OrderedDict, Python uređeni rječnik.

Poslovanje

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.

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.

  1. Navedite objekte pogleda koji se mogu dobiti metodom items() pomoću liste().
  2. Dodajte tuple (ključ, vrijednost) parova ključ/vrijednost u metodu insert() popisa
  3. 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.

  1. Navedite objekte pogleda koji se mogu dobiti metodom items() pomoću liste().
  2. Zamijenite elemente na popisu
  3. 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)])