Cara menggunakan OrderedDict, kamus pesanan Python.

Perniagaan

Kamus Python (objek jenis dict) tidak mengekalkan susunan unsur; CPython telah melakukannya sejak 3.6, tetapi ia bergantung pada pelaksanaan dan tidak pasti dalam pelaksanaan lain; spesifikasi bahasa telah mengekalkan susunan sejak 3.7.

OrderedDict disediakan dalam modul koleksi perpustakaan standard sebagai kamus yang mengekalkan perintah itu. Ia selamat untuk menggunakan yang ini.

Import modul koleksi. Ia termasuk dalam perpustakaan standard dan tidak perlu dipasang.

import collections

Jika anda menulis perkara berikut, anda boleh meninggalkan koleksi. dalam contoh berikut.

from collections import OrderedDict

Berikut ialah penerangan tentang cara menggunakan OrderedDict.

  • Mencipta objek OrderedDict
  • OrderedDict ialah subkelas dict
  • Alihkan elemen ke permulaan atau akhir
  • Tambah elemen baharu pada sebarang kedudukan.
  • Susun semula (susun semula) elemen
  • Isih elemen mengikut kunci atau nilai

Mencipta objek OrderedDict

Koleksi pembina.OrdedDict() boleh digunakan untuk mencipta objek OrderedDict.

Buat objek OrderedDict kosong dan tambah nilai.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Ia juga mungkin untuk menentukan hujah kepada pembina.

Anda boleh menggunakan hujah kata kunci, jujukan pasangan nilai kunci (seperti tupel (kunci, nilai)), dan sebagainya. Yang terakhir boleh menjadi senarai atau tuple asalkan ia adalah pasangan nilai kunci.

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)])

Sehingga versi 3.5, susunan hujah kata kunci tidak dipelihara, tetapi sejak versi 3.6, ia kini dikekalkan.

Diubah dalam versi 3.6: Dengan penerimaan PEP 468, susunan pembina OrderedDict dan hujah kata kunci yang dihantar kepada kaedah kemas kini() dikekalkan.
collections — Container datatypes — Python 3.10.0 Documentation

Kamus biasa (objek jenis dict) juga boleh dihantar kepada pembina, tetapi dalam kes pelaksanaan di mana jenis dict tidak mengekalkan susunan, OrderedDict yang dihasilkan daripadanya juga tidak akan mengekalkan susunan.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict ialah subkelas dict

OrderedDict ialah subkelas dict.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict juga mempunyai kaedah yang sama seperti dict, dan kaedah untuk mendapatkan, menukar, menambah dan mengalih keluar elemen adalah sama seperti 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)])

Lihat artikel berikut untuk butirannya.

Alihkan elemen ke permulaan atau akhir

Anda boleh menggunakan kaedah sendiri OrderedDict move_to_end() untuk mengalihkan elemen ke permulaan atau penghujung.

Tentukan kunci sebagai hujah pertama. Lalai adalah untuk bergerak ke penghujung, tetapi jika argumen kedua terakhir adalah palsu, ia akan dialihkan ke permulaan.

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)])

Tambah elemen baharu pada sebarang kedudukan.

Adalah mungkin untuk mencipta objek OrderedDict baharu dengan elemen baharu ditambah pada kedudukan sewenang-wenangnya. Secara khusus, ini boleh dilakukan dalam aliran berikut.

  1. Senaraikan objek paparan yang boleh diperoleh dengan kaedah item() menggunakan list().
  2. Tambahkan tuple (kunci, nilai) pasangan nilai kunci dalam kaedah sisipan() senarai
  3. Cipta objek baharu dengan menghantarnya ke koleksi pembina.OrdedDict()
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() menentukan kedudukan yang hendak disisipkan sebagai argumen pertama, dan elemen yang akan disisipkan sebagai argumen kedua.

Dalam contoh, objek baharu diberikan kepada pembolehubah asal, dan tiada elemen baharu ditambahkan pada objek asal itu sendiri.

Susun semula (susun semula) elemen

Mengganti elemen adalah proses yang sama seperti dalam contoh di atas.

  1. Senaraikan objek paparan yang boleh diperoleh dengan kaedah item() menggunakan list().
  2. Gantikan elemen dalam senarai
  3. Cipta objek baharu dengan menghantarnya ke koleksi pembina.OrdedDict()
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)])

Jika anda ingin menentukan kunci dan menggantikannya, gunakan kaedah index() untuk mendapatkan indeks (kedudukan) daripada senarai kunci seperti yang ditunjukkan di bawah.

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)])

Isih elemen mengikut kunci atau nilai

Cipta senarai tupel (kunci, nilai) pasangan nilai kunci diisih berdasarkan objek paparan yang boleh diperolehi oleh kaedah item() dan hantarkannya kepada koleksi pembina.OrderedDict() untuk mencipta objek baharu.

Isih dilakukan dengan menentukan fungsi tanpa nama (ungkapan lambda) yang mengembalikan kunci atau nilai daripada tuple (kunci, nilai) sebagai kunci argumen bagi fungsi terbina dalam sorted().

Jika anda ingin membalikkan susunan, tetapkan hujah terbalik sorted() kepada benar.

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