ជម្រើស គំរូ និងជម្រើសដើម្បីជ្រើសរើសធាតុដោយចៃដន្យពីបញ្ជីនៅក្នុង Python ។

អាជីវកម្ម

ជម្រើសមុខងារ() គំរូ() និងជម្រើស() នៅក្នុងម៉ូឌុលចៃដន្យនៃបណ្ណាល័យស្តង់ដារ 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