ជម្រើសមុខងារ() គំរូ() និងជម្រើស() នៅក្នុងម៉ូឌុលចៃដន្យនៃបណ្ណាល័យស្តង់ដារ Python អាចត្រូវបានប្រើដើម្បីជ្រើសរើស និងទាញយកធាតុដោយចៃដន្យពីបញ្ជីមួយ tuple ខ្សែអក្សរ ឬវត្ថុលំដាប់ផ្សេងទៀត (គំរូចៃដន្យ)។
choice() ទទួលបានធាតុតែមួយ គំរូ() និងជម្រើស() ទទួលបានបញ្ជីនៃធាតុច្រើន។ sample() គឺជាការទាញយកដែលមិនអាចយកមកវិញបានដោយមិនមានស្ទួនទេ ជម្រើស() គឺជាការស្រង់យកមកវិញជាមួយនឹងស្ទួន។
ព័ត៌មានខាងក្រោមត្រូវបានផ្តល់ជូននៅទីនេះ។
- ជ្រើសរើសធាតុមួយដោយចៃដន្យ។:
random.choice()
- ជ្រើសរើសធាតុជាច្រើនដោយចៃដន្យ (មិនចម្លង):
random.sample()
- ជ្រើសរើសធាតុជាច្រើនដោយចៃដន្យ (ជាមួយស្ទួន):
random.choices()
- ជួសជុលគ្រាប់ពូជលេខចៃដន្យ
ជ្រើសរើសធាតុមួយដោយចៃដន្យ។:random.choice()
ជាមួយនឹងមុខងាររបស់ម៉ូឌុលចៃដន្យជ្រើសរើស() ធាតុមួយត្រូវបានជ្រើសរើសដោយចៃដន្យពីបញ្ជី ហើយអាចទាញយកមកវិញបាន។
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
ដូចគ្នានេះដែរអនុវត្តចំពោះ tuples និងខ្សែ។ ក្នុងករណីខ្សែអក្សរ តួអក្សរតែមួយត្រូវបានជ្រើសរើស។
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
កំហុសប្រសិនបើបញ្ជីទទេ tuple ឬខ្សែអក្សរត្រូវបានបញ្ជាក់ជាអាគុយម៉ង់។
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
ជ្រើសរើសធាតុជាច្រើនដោយចៃដន្យ (មិនចម្លង):random.sample()
ជាមួយនឹងមុខងារគំរូ() នៃម៉ូឌុលចៃដន្យ អ្នកអាចទទួលបានធាតុជាច្រើនដោយចៃដន្យពីបញ្ជីមួយ។ មិនមានការចម្លងនៃធាតុ (ការទាញយកដែលមិនអាចយកមកវិញបាន) ។
អាគុយម៉ង់ទីមួយគឺជាបញ្ជី ហើយអាគុយម៉ង់ទីពីរគឺជាចំនួនធាតុដែលត្រូវទៅយក។ បញ្ជីត្រូវបានត្រឡប់មកវិញ។
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
ប្រសិនបើអាគុយម៉ង់ទីពីរត្រូវបានកំណត់ទៅ 1 នោះបញ្ជីដែលមានធាតុមួយក៏ត្រូវបានបញ្ជូនមកវិញផងដែរ។ ប្រសិនបើវាត្រូវបានកំណត់ទៅ 0 នោះបញ្ជីគឺទទេ។ ប្រសិនបើអាគុយម៉ង់ទីពីរគឺ 1 នោះបញ្ជីដែលមានធាតុមួយនឹងត្រលប់មកវិញ។ ប្រសិនបើវាជា 0 បញ្ជីទទេត្រូវបានត្រឡប់។ ប្រសិនបើអាគុយម៉ង់ទីមួយមានច្រើនជាងចំនួនធាតុនៅក្នុងបញ្ជី កំហុសកើតឡើង។
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
ប្រសិនបើអាគុយម៉ង់ទីមួយគឺជា tuple ឬ string នោះអ្វីដែលត្រូវបានត្រឡប់មកវិញនៅតែជាបញ្ជី។
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
ប្រសិនបើអ្នកចង់ត្រលប់ទៅ tuple ឬ string សូមប្រើ tuple(),join()។
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
ចំណាំថាតម្លៃមិនត្រូវបានវិនិច្ឆ័យទេ ដូច្នេះប្រសិនបើបញ្ជីដើម ឬ tuple មានធាតុដែលមានតម្លៃដូចគ្នា វាមានលទ្ធភាពដែលតម្លៃដូចគ្នានឹងត្រូវបានជ្រើសរើស។
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
ប្រសិនបើអ្នកចង់ជៀសវាងតម្លៃស្ទួន អ្នកអាចប្រើ set() ដើម្បីបំប្លែងវាទៅជា set (set type) ហើយស្រង់ចេញតែធាតុតែមួយគត់ ហើយបន្ទាប់មកប្រើ sample()។
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
ជ្រើសរើសធាតុជាច្រើនដោយចៃដន្យ (ជាមួយស្ទួន):random.choices()
ជម្រើសមុខងាររបស់ម៉ូឌុលចៃដន្យ () អនុញ្ញាតឱ្យអ្នកទាញយកធាតុជាច្រើនដោយចៃដន្យពីបញ្ជីមួយ ហើយមិនដូចគំរូ () វាអនុញ្ញាតឱ្យជ្រើសរើសធាតុស្ទួន។
choices() គឺជាមុខងារដែលត្រូវបានបន្ថែមនៅក្នុង Python 3.6។ វាមិនមាននៅក្នុងកំណែមុនទេ។
អាគុយម៉ង់ k បញ្ជាក់ចំនួនធាតុដែលត្រូវទៅយក។ ការចម្លងត្រូវបានអនុញ្ញាត ដូច្នេះចំនួនធាតុដែលត្រូវទាញយកអាចធំជាងចំនួនធាតុនៅក្នុងបញ្ជីដើម។
ដោយសារ k គឺជាអាគុយម៉ង់សម្រាប់តែពាក្យគន្លឹះ វាចាំបាច់ក្នុងការបញ្ជាក់ពាក្យគន្លឹះដូចជា k=3 ។
import random
l = [0, 1, 2, 3, 4]
print(random.choices(l, k=3))
# [2, 1, 0]
print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]
តម្លៃលំនាំដើមនៃ k គឺ 1; ប្រសិនបើវាត្រូវបានលុបចោល បញ្ជីដែលមានធាតុ 1 នឹងត្រលប់មកវិញ។
print(random.choices(l))
# [1]
ទម្ងន់អាគុយម៉ង់អាចត្រូវបានប្រើដើម្បីបញ្ជាក់ទម្ងន់ (ប្រូបាប៊ីលីតេ) ដែលធាតុនីមួយៗនឹងត្រូវបានជ្រើសរើស ហើយប្រភេទនៃធាតុនៅក្នុងបញ្ជីអាចជា int ឬអណ្តែត។
print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]
print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]
អាគុយម៉ង់ cum_weights ក៏អាចត្រូវបានបញ្ជាក់ជាទម្ងន់បង្គរផងដែរ។ cum_weights នៅក្នុងកូដគំរូខាងក្រោមគឺស្មើនឹងទម្ងន់ទីមួយខាងលើ។
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
លំនាំដើមសម្រាប់ទាំងទម្ងន់អាគុយម៉ង់ និង cum_weights គឺគ្មាន ដែលមានន័យថាធាតុនីមួយៗត្រូវបានជ្រើសរើសដោយមានប្រូបាប៊ីលីតេដូចគ្នា។
ប្រសិនបើប្រវែង (ចំនួនធាតុ) នៃទម្ងន់អាគុយម៉ង់ ឬ cum_weights ខុសពីបញ្ជីដើម កំហុសកើតឡើង។
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
វាក៏ជាកំហុសក្នុងការបញ្ជាក់ទម្ងន់ និង cum_weights ក្នុងពេលតែមួយ។
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights
យើងបានបញ្ជាក់បញ្ជីមួយជាអាគុយម៉ង់ដំបូងជាឧទាហរណ៍ក្នុងកូដគំរូរហូតមកដល់ពេលនេះ ប៉ុន្តែវាអនុវត្តដូចគ្នាទៅនឹង tuples និង strings។
ជួសជុលគ្រាប់ពូជលេខចៃដន្យ
ដោយផ្តល់ចំនួនគត់តាមអំពើចិត្តទៅគ្រាប់ពូជមុខងាររបស់ម៉ូឌុលចៃដន្យ () គ្រាប់ពូជលេខចៃដន្យអាចត្រូវបានជួសជុល ហើយម៉ាស៊ីនបង្កើតលេខចៃដន្យអាចត្រូវបានចាប់ផ្តើម។
បន្ទាប់ពីការចាប់ផ្តើមជាមួយគ្រាប់ពូជដូចគ្នា ធាតុតែងតែត្រូវបានជ្រើសរើសតាមរបៀបដូចគ្នា។
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3