របៀបប្រើ OrderedDict ដែលជាវចនានុក្រមបញ្ជា Python ។

អាជីវកម្ម

វចនានុក្រម Python (វត្ថុនៃប្រភេទ dict) មិនរក្សាលំដាប់នៃធាតុ; CPython បានធ្វើដូច្នេះតាំងពី 3.6 ប៉ុន្តែវាអាស្រ័យលើការអនុវត្ត និងមិនកំណត់ក្នុងការអនុវត្តផ្សេងទៀត; ការបញ្ជាក់ភាសាបានរក្សាលំដាប់តាំងពី 3.7 ។

OrderedDict ត្រូវបានផ្តល់ជូននៅក្នុងម៉ូឌុលបណ្តុំនៃបណ្ណាល័យស្តង់ដារជាវចនានុក្រមដែលរក្សាលំដាប់។ វាមានសុវត្ថិភាពក្នុងការប្រើមួយនេះ។

នាំចូលម៉ូឌុលប្រមូល។ វាត្រូវបានរួមបញ្ចូលនៅក្នុងបណ្ណាល័យស្តង់ដារហើយមិនចាំបាច់ដំឡើងទេ។

import collections

ប្រសិនបើអ្នកសរសេរខាងក្រោម អ្នកអាចលុបចោលបណ្តុំ។ ក្នុងឧទាហរណ៍ខាងក្រោម។

from collections import OrderedDict

ខាងក្រោមនេះគឺជាការពិពណ៌នាអំពីរបៀបប្រើ OrderedDict ។

  • ការបង្កើតវត្ថុ OrderedDict
  • OrderedDict គឺជាថ្នាក់រងនៃ dict
  • ផ្លាស់ទីធាតុទៅដើមឬបញ្ចប់
  • បន្ថែមធាតុថ្មីនៅទីតាំងណាមួយ។
  • រៀបចំឡើងវិញ (តម្រៀបឡើងវិញ) ធាតុ
  • តម្រៀបធាតុតាមគន្លឹះ ឬតម្លៃ

ការបង្កើតវត្ថុ OrderedDict

Constructor collections.OrderedDict() អាចត្រូវបានប្រើដើម្បីបង្កើតវត្ថុ OrderedDict ។

បង្កើតវត្ថុ OrderedDict ទទេ ហើយបន្ថែមតម្លៃ។

od = collections.OrderedDict()

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

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

វាក៏អាចបញ្ជាក់អាគុយម៉ង់ទៅ constructor ផងដែរ។

អ្នកអាចប្រើអំណះអំណាងពាក្យគន្លឹះ លំដាប់នៃគូតម្លៃគន្លឹះ (ដូចជា tuples (key, value)) ជាដើម។ ក្រោយមកទៀតអាចជាបញ្ជី ឬ tuple ដរាបណាវាជាគូតម្លៃគន្លឹះ។

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

រហូតមកដល់កំណែ 3.5 លំដាប់នៃអាគុយម៉ង់ពាក្យគន្លឹះមិនត្រូវបានរក្សាទុកទេ ប៉ុន្តែចាប់តាំងពីកំណែ 3.6 ឥឡូវនេះវាត្រូវបានរក្សាទុក។

បានផ្លាស់ប្តូរនៅក្នុងកំណែ 3.6៖ ជាមួយនឹងការទទួលយក PEP 468 លំដាប់នៃ OrderedDict constructor និងអាគុយម៉ង់ពាក្យគន្លឹះដែលបានបញ្ជូនទៅវិធីសាស្ត្រ update() ត្រូវបានរក្សាទុក។
collections — Container datatypes — Python 3.10.0 Documentation

វចនានុក្រមធម្មតា (វត្ថុប្រភេទ dict) ក៏អាចត្រូវបានបញ្ជូនទៅអ្នកសាងសង់ផងដែរ ប៉ុន្តែក្នុងករណីការអនុវត្តដែលប្រភេទ dict មិនរក្សាសណ្តាប់ធ្នាប់ នោះ OrderedDict ដែលបង្កើតចេញពីវាក៏នឹងមិនរក្សាសណ្តាប់ធ្នាប់ដែរ។

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

OrderedDict គឺជាថ្នាក់រងនៃ dict

OrderedDict គឺជាថ្នាក់រងនៃ dict ។

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

OrderedDict ក៏មានវិធីសាស្រ្តដូចគ្នាទៅនឹង dict ហើយវិធីសាស្រ្តសម្រាប់ការទទួលបាន ផ្លាស់ប្តូរ បន្ថែម និងដកចេញធាតុគឺដូចគ្នាទៅនឹង 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)])

សូមមើលអត្ថបទខាងក្រោមសម្រាប់ព័ត៌មានលម្អិត។

ផ្លាស់ទីធាតុទៅដើមឬបញ្ចប់

អ្នកអាចប្រើវិធីផ្ទាល់ខ្លួនរបស់ OrderedDict move_to_end() ដើម្បីផ្លាស់ទីធាតុមួយទៅដើម ឬចុងបញ្ចប់។

បញ្ជាក់គន្លឹះជាអាគុយម៉ង់ដំបូង។ លំនាំដើមគឺត្រូវផ្លាស់ទីទៅចុងបញ្ចប់ ប៉ុន្តែប្រសិនបើអាគុយម៉ង់ទីពីរចុងក្រោយគឺមិនពិត នោះវានឹងត្រូវបានផ្លាស់ទីទៅដើម។

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

បន្ថែមធាតុថ្មីនៅទីតាំងណាមួយ។

វាអាចធ្វើទៅបានដើម្បីបង្កើតវត្ថុ OrderedDict ថ្មីជាមួយនឹងធាតុថ្មីដែលបានបន្ថែមនៅទីតាំងបំពាន។ ជាពិសេស នេះអាចត្រូវបានធ្វើនៅក្នុងលំហូរខាងក្រោម។

  1. រាយ​វត្ថុ​ទិដ្ឋភាព​ដែល​អាច​ទទួល​បាន​ដោយ​ប្រើ​វិធីសាស្ត្រ items() ដោយ​ប្រើ list() ។
  2. បន្ថែម tuple (key, value) នៃ key-value pairs នៅក្នុងវិធី insert() របស់បញ្ជី
  3. បង្កើតវត្ថុថ្មីដោយបញ្ជូនវាទៅ constructor 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() បញ្ជាក់ទីតាំងដែលត្រូវបញ្ចូលជាអាគុយម៉ង់ទីមួយ ហើយធាតុដែលត្រូវបញ្ចូលជាអាគុយម៉ង់ទីពីរ។

ក្នុង​ឧទាហរណ៍ វត្ថុ​ថ្មី​ត្រូវ​បាន​កំណត់​ទៅ​អថេរ​ដើម ហើយ​គ្មាន​ធាតុ​ថ្មី​ត្រូវ​បាន​បន្ថែម​ទៅ​វត្ថុ​ដើម​នោះ​ទេ។

រៀបចំឡើងវិញ (តម្រៀបឡើងវិញ) ធាតុ

ការជំនួសធាតុគឺជាដំណើរការដូចគ្នាដូចក្នុងឧទាហរណ៍ខាងលើ។

  1. រាយ​វត្ថុ​ទិដ្ឋភាព​ដែល​អាច​ទទួល​បាន​ដោយ​ប្រើ​វិធីសាស្ត្រ items() ដោយ​ប្រើ list() ។
  2. ជំនួសធាតុនៅក្នុងបញ្ជីមួយ។
  3. បង្កើតវត្ថុថ្មីដោយបញ្ជូនវាទៅ constructor 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)])

ប្រសិនបើ​អ្នក​ចង់​បញ្ជាក់​កូនសោ​មួយ ហើយ​ជំនួស​វា សូម​ប្រើ​វិធីសាស្ត្រ index() ដើម្បី​យក​លិបិក្រម (ទីតាំង) ពី​បញ្ជី​សោ​ដូច​បង្ហាញ​ខាងក្រោម។

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

តម្រៀបធាតុតាមគន្លឹះ ឬតម្លៃ

បង្កើតបញ្ជីនៃ tuples (key, value) នៃគូ key-value ដែលត្រូវបានតម្រៀបដោយផ្អែកលើ view object ដែលអាចទទួលបានដោយ items() method ហើយបញ្ជូនវាទៅ constructor collections.OrderedDict() ដើម្បីបង្កើត object ថ្មី។

ការតម្រៀបត្រូវបានអនុវត្តដោយបញ្ជាក់មុខងារអនាមិក (កន្សោម lambda) ដែលត្រឡប់សោ ឬតម្លៃពី tuple (កូនសោតម្លៃ) ជាកូនសោអាគុយម៉ង់នៃមុខងារដែលបានតម្រៀបក្នុងស្រាប់។

ប្រសិនបើអ្នកចង់បញ្ច្រាសលំដាប់ សូមកំណត់អាគុយម៉ង់បញ្ច្រាសនៃតម្រៀប() ទៅពិត។

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