ខាងក្រោមនេះគឺជាការពិពណ៌នាអំពីរបៀបកំណត់ថាតើបញ្ជី (អារេ) មានធាតុស្ទួន (ធាតុទាំងអស់មានតែមួយ/ប្លែក) ក្នុង Python សម្រាប់ករណីដូចខាងក្រោមនីមួយៗ។
- សម្រាប់បញ្ជីដែលគ្មានបញ្ជីនៅក្នុងធាតុ
- សម្រាប់បញ្ជីដែលមានបញ្ជីធាតុ (អារេពីរវិមាត្រ បញ្ជីបញ្ជី ។ល។)
សូមមើលអត្ថបទខាងក្រោមអំពីរបៀបលុប ឬស្រង់ធាតុស្ទួនចេញពីបញ្ជី។
ចំណាំថាបញ្ជីអាចរក្សាទុកប្រភេទទិន្នន័យផ្សេងៗគ្នា ហើយខុសគ្នាយ៉ាងតឹងរ៉ឹងពីអារេ។ ប្រសិនបើអ្នកចង់គ្រប់គ្រងអារេនៅក្នុងដំណើរការដែលទាមទារទំហំអង្គចងចាំ និងអាសយដ្ឋានអង្គចងចាំ ឬដំណើរការជាលេខនៃទិន្នន័យធំ សូមប្រើអារេ (បណ្ណាល័យស្តង់ដារ) ឬ NumPy ។
កំណត់ថាតើមានធាតុស្ទួននៅក្នុងបញ្ជី (ប្រសិនបើធាតុមិនមានបញ្ជី)
ប្រសិនបើធាតុមិនមានវត្ថុដែលអាចអាប់ដេតបានដូចជាបញ្ជីទេ សូមប្រើ constructor set() នៃប្រភេទ set set។
- ពាក់ព័ន្ធ៖កំណត់ប្រតិបត្តិការ (ឧ. កំណត់សំណុំសហជីព សំណុំផលិតផល និងសំណុំរង) ជាមួយនឹងប្រភេទសំណុំរបស់ Python
ប្រភេទសំណុំគឺជាប្រភេទទិន្នន័យដែលមិនមានធាតុស្ទួន។ នៅពេលដែលបញ្ជីត្រូវបានបញ្ជូនទៅ constructor set() តម្លៃស្ទួនត្រូវបានមិនអើពើ ហើយវត្ថុនៃប្រភេទដែលបានកំណត់ជាមួយនឹងតម្លៃតែមួយគត់ដែលជាធាតុត្រូវបានបញ្ជូនត្រឡប់មកវិញ។
ចំនួនធាតុនៅក្នុងវត្ថុប្រភេទសំណុំនេះ និងបញ្ជីដើមត្រូវបានទទួល និងប្រៀបធៀបដោយប្រើមុខងារដែលភ្ជាប់មកជាមួយ len()។
- ប្រសិនបើចំនួនធាតុស្មើគ្នានោះ មិនមានធាតុស្ទួននៅក្នុងបញ្ជីដើមទេ។
- ធាតុស្ទួនត្រូវបានបញ្ចូលក្នុងបញ្ជីដើម ប្រសិនបើចំនួនធាតុខុសគ្នា
អនុគមន៍ដែលត្រឡប់មិនពិត ប្រសិនបើមិនមានធាតុស្ទួន និងពិតប្រសិនបើមានធាតុស្ទួនមានដូចខាងក្រោម
def has_duplicates(seq):
return len(seq) != len(set(seq))
l = [0, 1, 2]
print(has_duplicates(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates(l))
# True
ឧទាហរណ៍គឺជាបញ្ជីមួយ ប៉ុន្តែមុខងារដូចគ្នាអាចត្រូវបានប្រើជាមួយ tuples ។
វត្ថុដែលអាចផ្លាស់ប្តូរបាន (អាចធ្វើបច្ចុប្បន្នភាព) ដូចជាបញ្ជីមិនអាចជាធាតុនៃប្រភេទដែលបានកំណត់ទេ។ ដូច្នេះបញ្ជីដែលមានបញ្ជីជាធាតុ (អារេពីរវិមាត្របញ្ជីបញ្ជី។ ល។ ) នឹងបណ្តាលឱ្យមានកំហុស Type ។ វិធានការប្រឆាំងត្រូវបានបង្ហាញខាងក្រោម។
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
កំណត់ថាតើមានធាតុស្ទួននៅក្នុងបញ្ជី (ប្រសិនបើធាតុមានបញ្ជី)
ក្នុងករណីបញ្ជីដែលមានបញ្ជីធាតុ (ដូចជាបញ្ជីបញ្ជី) មុខងារខាងក្រោមអាចត្រូវបានប្រើដើម្បីកំណត់ថាតើមានធាតុស្ទួនឬអត់។
def has_duplicates2(seq):
seen = []
unique_list = [x for x in seq if x not in seen and not seen.append(x)]
return len(seq) != len(unique_list)
l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False
l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True
ជំនួសឱ្យ set() កំណត់ចំណាំក្នុងបញ្ជីបង្កើតបញ្ជីដែលធាតុមានត្រឹមតែតម្លៃតែមួយគត់ ហើយចំនួនធាតុត្រូវបានប្រៀបធៀប។ សូមមើលអត្ថបទខាងក្រោមសម្រាប់ព័ត៌មានលម្អិត។
មុខងារនេះក៏មានសុពលភាពសម្រាប់បញ្ជីដែលមិនមានបញ្ជីធាតុ។
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
ឧទាហរណ៍រហូតមកដល់ពេលនេះគឺជាការកំណត់ថាតើបញ្ជីធាតុត្រូវបានចម្លង (មានបញ្ជីដូចគ្នា) ។
ថាតើធាតុនៃបញ្ជីត្រួតលើគ្នាអាចកំណត់បានដែរឬទេ បន្ទាប់ពីបង្រួមបញ្ជីដើមទៅជាវិមាត្រមួយ។
l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]
print(has_duplicates(sum(l_2d, [])))
# False
l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True
នៅទីនេះ sum() ត្រូវបានប្រើដើម្បីបង្រួមបញ្ជី ប៉ុន្តែ itertools.chain.from_iterable() ក៏អាចត្រូវបានប្រើផងដែរ។ លើសពីនេះទៀតនៅពេលបង្រួមបញ្ជីនៃវិមាត្របីឬច្រើនវាចាំបាច់ត្រូវកំណត់មុខងារថ្មី។