ផ្នែកនេះពិពណ៌នាអំពីរបៀបបង្កើតបញ្ជីថ្មីនៅក្នុង Python ដោយលុប ឬស្រង់ធាតុស្ទួនចេញពីបញ្ជី (អារេ)។
ព័ត៌មានលម្អិតខាងក្រោមត្រូវបានពិពណ៌នានៅទីនេះ។
- យកធាតុស្ទួនចេញ ហើយបង្កើតបញ្ជីថ្មី។
- កុំរក្សាលំដាប់នៃការចុះបញ្ជីដើម:
set()
- រក្សាលំដាប់នៃការចុះបញ្ជីដើម:
dict.fromkeys()
,sorted()
- អារេពីរវិមាត្រ (បញ្ជីរាយនាម)
- កុំរក្សាលំដាប់នៃការចុះបញ្ជីដើម:
- ស្រង់ធាតុស្ទួន និងបង្កើតបញ្ជីថ្មី។
- កុំរក្សាលំដាប់នៃការចុះបញ្ជីដើម
- រក្សាលំដាប់នៃការចុះបញ្ជីដើម
- អារេពីរវិមាត្រ (បញ្ជីរាយនាម)
គំនិតដូចគ្នាអាចត្រូវបានអនុវត្តចំពោះ tuples ជំនួសឱ្យបញ្ជី។
សូមមើលអត្ថបទខាងក្រោមសម្រាប់
- ប្រសិនបើអ្នកចង់កំណត់ថាតើបញ្ជី ឬ tuple មានធាតុស្ទួនឬអត់
- ប្រសិនបើអ្នកចង់ស្រង់ធាតុដែលជារឿងធម្មតា ឬមិនទូទៅក្នុងចំណោមបញ្ជីច្រើន ជំនួសឱ្យការចុះបញ្ជីតែមួយ
ចំណាំថាបញ្ជីអាចរក្សាទុកប្រភេទទិន្នន័យផ្សេងៗគ្នា ហើយខុសគ្នាយ៉ាងតឹងរ៉ឹងពីអារេ។ ប្រសិនបើអ្នកចង់គ្រប់គ្រងអារេនៅក្នុងដំណើរការដែលទាមទារទំហំអង្គចងចាំ និងអាសយដ្ឋានអង្គចងចាំ ឬដំណើរការជាលេខនៃទិន្នន័យធំ សូមប្រើអារេ (បណ្ណាល័យស្តង់ដារ) ឬ NumPy ។
យកធាតុស្ទួនចេញ ហើយបង្កើតបញ្ជីថ្មី។
កុំរក្សាលំដាប់នៃការចុះបញ្ជីដើម:set()
ប្រសិនបើមិនចាំបាច់រក្សាលំដាប់នៃបញ្ជីដើមទេ សូមប្រើ set() ដែលបង្កើត set type set ។
ប្រភេទសំណុំគឺជាប្រភេទទិន្នន័យដែលមិនមានធាតុស្ទួន។ នៅពេលដែលបញ្ជី ឬប្រភេទទិន្នន័យផ្សេងទៀតត្រូវបានបញ្ជូនទៅ set() តម្លៃស្ទួនត្រូវបានមិនអើពើ ហើយវត្ថុនៃសំណុំប្រភេទត្រូវបានបញ្ជូនមកវិញ ដែលមានតែតម្លៃតែមួយគត់គឺជាធាតុ។
ប្រសិនបើអ្នកចង់ធ្វើឱ្យវាក្លាយជា tuple សូមប្រើ tuple()។
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(set(l))
# {1, 2, 3, 4, 5}
print(list(set(l)))
# [1, 2, 3, 4, 5]
ជាការពិតណាស់វាក៏អាចត្រូវបានទុកជាការកំណត់។ សូមមើលអត្ថបទខាងក្រោមសម្រាប់ព័ត៌មានបន្ថែមអំពីប្រភេទសំណុំ។
- ពាក់ព័ន្ធ៖កំណត់ប្រតិបត្តិការ (ឧ. កំណត់សំណុំសហជីព សំណុំផលិតផល និងសំណុំរង) ជាមួយនឹងប្រភេទសំណុំរបស់ Python
រក្សាលំដាប់នៃការចុះបញ្ជីដើម:dict.fromkeys(),sorted()
បើអ្នកចង់រក្សាលំដាប់នៃបញ្ជីដើម សូមប្រើ class method fromkeys() នៃប្រភេទវចនានុក្រម ឬមុខងារដែលភ្ជាប់មកជាមួយ sorted()។
dict.fromkeys() បង្កើតវចនានុក្រមថ្មីមួយដែលកូនសោរបស់វាគឺជាបញ្ជី, tuples ជាដើមដែលបានបញ្ជាក់ក្នុងអាគុយម៉ង់។ ប្រសិនបើអាគុយម៉ង់ទីពីរត្រូវបានលុបចោល តម្លៃគឺគ្មានទេ។
ដោយសារគ្រាប់ចុចវចនានុក្រមមិនមានធាតុស្ទួន តម្លៃស្ទួនត្រូវបានមិនអើពើដូចនៅក្នុង set()។ លើសពីនេះ វត្ថុវចនានុក្រមមួយអាចត្រូវបានឆ្លងកាត់ជាអាគុយម៉ង់មួយទៅកាន់បញ្ជី () ដើម្បីទទួលបានបញ្ជីដែលធាតុរបស់វាជាសោវចនានុក្រម។
print(dict.fromkeys(l))
# {3: None, 2: None, 1: None, 5: None, 4: None}
print(list(dict.fromkeys(l)))
# [3, 2, 1, 5, 4]
វាត្រូវបានធានាចាប់តាំងពី Python 3.7 (CPython គឺ 3.6) ថា dict.fromkeys() រក្សាលំដាប់នៃលំដាប់អាគុយម៉ង់។ កំណែមុនប្រើមុខងារដែលភ្ជាប់មកជាមួយ sorted() ដូចខាងក្រោម។
បញ្ជាក់បញ្ជីវិធីសាស្ត្រ tuple index() សម្រាប់ argument key នៃការតម្រៀប ដែលត្រឡប់បញ្ជីធាតុដែលបានតម្រៀប។
index() គឺជាវិធីសាស្រ្តដែលត្រឡប់លិបិក្រមនៃតម្លៃ (ចំនួននៃធាតុនៅក្នុងបញ្ជី) ដែលអាចត្រូវបានបញ្ជាក់ជាគន្លឹះនៃតម្រៀប() ដើម្បីតម្រៀបបញ្ជីដោយផ្អែកលើលំដាប់នៃបញ្ជីដើម។ គ្រាប់ចុចអាគុយម៉ង់ត្រូវបានបញ្ជាក់ជាវត្ថុដែលអាចហៅបាន (callable) ដូច្នេះកុំសរសេរ () ។
print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]
អារេពីរវិមាត្រ (បញ្ជីរាយនាម)
សម្រាប់អារេពីរវិមាត្រ (បញ្ជីបញ្ជី) វិធីសាស្ត្រដោយប្រើ set() ឬ dict.fromkeys() បណ្តាលឱ្យ TypeError ។
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
# l_2d_unique = list(set(l_2d))
# TypeError: unhashable type: 'list'
# l_2d_unique_order = dict.fromkeys(l_2d)
# TypeError: unhashable type: 'list'
នេះដោយសារតែវត្ថុដែលមិនអាចប្រើប្រាស់បានដូចជាបញ្ជីមិនអាចជាធាតុនៃប្រភេទសំណុំឬគ្រាប់ចុចនៃពាក្យបញ្ជាប្រភេទ។
កំណត់មុខងារខាងក្រោម លំដាប់នៃបញ្ជីដើមត្រូវបានរក្សាទុក និងដំណើរការសម្រាប់បញ្ជីមួយវិមាត្រ និង tuples ។
def get_unique_list(seq):
seen = []
return [x for x in seq if x not in seen and not seen.append(x)]
print(get_unique_list(l_2d))
# [[1, 1], [0, 1], [0, 0], [1, 0]]
print(get_unique_list(l))
# [3, 2, 1, 5, 4]
កំណត់ចំណាំក្នុងបញ្ជីត្រូវបានប្រើ។
- ពាក់ព័ន្ធ៖របៀបប្រើការយល់បញ្ជី Python
នៅទីនេះយើងប្រើដូចខាងក្រោម
- ប្រសិនបើ X នៅក្នុង “X និង Y” គឺមិនពិតនៅក្នុងការវាយតម្លៃសៀគ្វីខ្លីរបស់ប្រតិបត្តិករ នោះ Y មិនត្រូវបានវាយតម្លៃទេ (មិនត្រូវបានអនុវត្ត) ។
- វិធីសាស្ត្រ append() ត្រឡប់ គ្មាន។
ប្រសិនបើធាតុនៃបញ្ជីដើម seq មិនមាននៅក្នុងការមើលឃើញនោះ និងបន្ទាប់ត្រូវបានវាយតម្លៃ។
see.append(x) ត្រូវបានប្រតិបត្តិ ហើយធាតុត្រូវបានបន្ថែមទៅមើលឃើញ។
ដោយសារតែ append() method ត្រឡប់ None ហើយ None គឺ False, not saw.append(x) វាយតម្លៃទៅ True។
កន្សោមតាមលក្ខខណ្ឌក្នុងបញ្ជីកំណត់ការយល់ដឹងក្លាយជាពិត ហើយត្រូវបានបន្ថែមជាធាតុនៃបញ្ជីដែលបានបង្កើតចុងក្រោយ។
ប្រសិនបើធាតុនៃ seq បញ្ជីដើមមានវត្តមាននៅក្នុងការមើលឃើញ នោះ x ដែលមិននៅក្នុងការមើលឃើញគឺជា False ហើយកន្សោមតាមលក្ខខណ្ឌសម្រាប់កន្សោមការយល់បញ្ជីគឺ False ។
ដូច្នេះ ពួកវាមិនត្រូវបានបន្ថែមជាធាតុនៃបញ្ជីដែលបានបង្កើតចុងក្រោយនោះទេ។
វិធីសាស្ត្រមួយទៀតគឺកំណត់អ័ក្សអាគុយម៉ង់ក្នុងមុខងាររបស់ NumPy np.unique() ទោះបីជាលទ្ធផលនឹងត្រូវបានតម្រៀបក៏ដោយ។
ស្រង់ធាតុស្ទួន និងបង្កើតបញ្ជីថ្មី។
កុំរក្សាលំដាប់នៃការចុះបញ្ជីដើម
ដើម្បីទាញយកតែធាតុស្ទួនពីបញ្ជីដើម សូមប្រើ collections.Counter()។
ត្រឡប់បណ្តុំមួយ។ Counter (ថ្នាក់រងនៃវចនានុក្រម) ដែលមានធាតុជាសោ និងចំនួនធាតុជាតម្លៃ។
import collections
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(collections.Counter(l))
# Counter({3: 3, 2: 2, 1: 2, 5: 1, 4: 1})
ដោយសារវាជាប្រភេទរងនៃវចនានុក្រម ធាតុ() អាចត្រូវបានប្រើដើម្បីទាញយកសោ និងតម្លៃ។ វាគ្រប់គ្រាន់ក្នុងការទាញយកសោដែលមានលេខពីរ ឬច្រើនជាងនេះ។
print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]
រក្សាលំដាប់នៃការចុះបញ្ជីដើម
ដូចដែលបានបង្ហាញក្នុងឧទាហរណ៍ខាងលើ ចាប់តាំងពី Python 3.7 កូនសោនៃ collections.Counter រក្សាលំដាប់នៃបញ្ជីដើម ហើយដូច្នេះនៅលើ។
នៅក្នុងកំណែមុន ការតម្រៀបជាមួយតម្រៀប () គឺគ្រប់គ្រាន់ហើយ ដូចជាការលុបធាតុស្ទួនដែរ។
print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]
ប្រសិនបើអ្នកចង់ទាញយកស្ទួនដូចដែលពួកវាមាន អ្នកគ្រាន់តែទុកធាតុពីបញ្ជីដើមដោយមានចំនួនពីរ ឬច្រើនជាងនេះ។ ការបញ្ជាទិញក៏ត្រូវបានរក្សាទុកផងដែរ។
cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]
អារេពីរវិមាត្រ (បញ្ជីរាយនាម)
សម្រាប់អារេពីរវិមាត្រ (បញ្ជីនៃបញ្ជី) មុខងារខាងក្រោមគឺអាចធ្វើទៅបាននៅពេលដែលលំដាប់នៃបញ្ជីដើមមិនត្រូវបានរក្សាទុក ហើយនៅពេលដែលវាត្រូវបានរក្សាទុករៀងៗខ្លួន។ វាក៏ដំណើរការសម្រាប់បញ្ជីមួយវិមាត្រ និង tuples ផងដែរ។
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
def get_duplicate_list(seq):
seen = []
return [x for x in seq if not seen.append(x) and seen.count(x) == 2]
def get_duplicate_list_order(seq):
seen = []
return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]
print(get_duplicate_list(l_2d))
# [[0, 1], [1, 1]]
print(get_duplicate_list_order(l_2d))
# [[1, 1], [0, 1]]
print(get_duplicate_list(l))
# [3, 1, 2]
print(get_duplicate_list_order(l))
# [3, 2, 1]
ប្រសិនបើអ្នកចង់ស្រង់ចេញដោយស្ទួន សូមទុកធាតុចេញពីបញ្ជីដើមដោយរាប់ពីរ ឬច្រើនជាងនេះ។
print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]
ចំណាំថាចាប់តាំងពីភាពស្មុគស្មាញនៃការគណនានៃ count() គឺ O(n) មុខងារដែលបានបង្ហាញខាងលើដែលប្រតិបត្តិម្តងហើយម្តងទៀត count() គឺគ្មានប្រសិទ្ធភាពខ្លាំង។ ប្រហែលជាមានវិធីដ៏ឆ្លាតវៃជាងនេះ។
Counter គឺជាប្រភេទរងនៃវចនានុក្រម ដូច្នេះប្រសិនបើអ្នកឆ្លងផុតបញ្ជី ឬ tuple ដែលធាតុរបស់វាជាបញ្ជី ឬវត្ថុដែលមិនអាចហាមបានផ្សេងទៀតទៅកាន់ collections.Counter() កំហុសនឹងកើតឡើង ហើយអ្នកនឹងមិនអាចប្រើវាបានទេ។
# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'