Python ရှိ စာရင်းတစ်ခုမှ အစိတ်အပိုင်းများကို ကျပန်းရွေးချယ်ရန် ရွေးချယ်မှု၊ နမူနာနှင့် ရွေးချယ်မှုများ။

စီးပွားရေးလုပ်ငန်း

Python standard library ၏ ကျပန်း module အတွင်းရှိ functions choice(), sample() နှင့် choices() ကို list, tuple, string, or other sequence object (random sampling) မှ အစိတ်အပိုင်းများကို ကျပန်းရွေးချယ်ပြီး ထုတ်ယူရန်အတွက် အသုံးပြုနိုင်ပါသည်။

choice() သည် ဒြပ်စင်တစ်ခုတည်းကိုရရှိသည်၊ နမူနာ() နှင့် ရွေးချယ်မှုများ() သည် များစွာသောဒြပ်စင်များစာရင်းကို ရယူသည်။ sample() သည် ထပ်တူများမရှိဘဲ ပြန်လည်ရယူ၍မရသော ထုတ်ယူခြင်းဖြစ်ပြီး ရွေးချယ်မှုများ() သည် ထပ်တူများဖြင့် ပြန်လည်ထုတ်ယူနိုင်သော ထုတ်ယူမှုဖြစ်သည်။

အောက်ပါအချက်အလက်များကို ဤနေရာတွင် ဖော်ပြပေးထားပါသည်။

  • အစိတ်အပိုင်းတစ်ခုကို ကျပန်းရွေးချယ်ပါ။:random.choice()
  • အစိတ်အပိုင်းများစွာကို ကျပန်းရွေးချယ်ပါ (ထပ်နေခြင်းမရှိပါ):random.sample()
  • အစိတ်အပိုင်းများစွာကို ကျပန်းရွေးချယ်ပါ (ထပ်နေသည့်အရာများနှင့်အတူ):random.choices()
  • ကျပန်းနံပါတ်အမျိုးအနွယ်ကိုပြင်ပါ။

အစိတ်အပိုင်းတစ်ခုကို ကျပန်းရွေးချယ်ပါ။:random.choice()

ကျပန်း module ၏ function သည် choose() ဖြင့် ဒြပ်စင်တစ်ခုအား စာရင်းမှ ကျပန်းရွေးချယ်ပြီး ပြန်လည်ရယူနိုင်ပါသည်။

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

tuples နှင့် strings များနှင့် အလားတူသည်။ စာကြောင်းများကိစ္စတွင်၊ စာလုံးတစ်လုံးတည်းကို ရွေးထားသည်။

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

ကျပန်း module ၏ လုပ်ဆောင်ချက်နမူနာ() ဖြင့်၊ သင်သည် စာရင်းတစ်ခုမှ ကျပန်းဒြပ်စင်များစွာကို ရနိုင်သည်။ ဒြပ်စင်များ ထပ်ပွားခြင်း မရှိပါ (ပြန်လည်ရယူ၍မရသော ထုတ်ယူခြင်း)။

ပထမအငြင်းအခုံသည် စာရင်းတစ်ခုဖြစ်ပြီး ဒုတိယအငြင်းအခုံသည် ပြန်လည်ရယူရမည့်ဒြပ်စင်အရေအတွက်ဖြစ်သည်။ စာရင်းပြန်ပေးတယ်။

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 type) အဖြစ်ပြောင်းရန်နှင့် ထူးခြားသောဒြပ်စင်များကိုသာ ထုတ်ယူရန် set() ကိုသုံး၍ sample() ကိုသုံးနိုင်သည်။

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

အစိတ်အပိုင်းများစွာကို ကျပန်းရွေးချယ်ပါ (ထပ်နေသည့်အရာများနှင့်အတူ):random.choices()

ကျပန်း module ၏လုပ်ဆောင်ချက်ရွေးချယ်မှုများ() သည် သင့်အား စာရင်းတစ်ခုမှကျပန်းဒြပ်စင်များစွာကိုထုတ်ယူနိုင်စေပြီး နမူနာ() နှင့်မတူဘဲ ပွားနေသောဒြပ်စင်များကိုရွေးချယ်ခွင့်ပြုသည်။

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 သို့မဟုတ် float ဖြစ်နိုင်သည်။

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 နှစ်ခုလုံးအတွက် ပုံသေသည် None ဖြစ်ပြီး ဆိုလိုသည်မှာ ဒြပ်စင်တစ်ခုစီကို တူညီသောဖြစ်နိုင်ခြေဖြင့် ရွေးချယ်ထားသည်။

အငြင်းအခုံအလေးများ သို့မဟုတ် 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 များနှင့် သက်ဆိုင်ပါသည်။

ကျပန်းနံပါတ်အမျိုးအနွယ်ကိုပြင်ပါ။

ကျပန်း module ၏ function seed() သို့ မထင်သလို ကိန်းပြည့်တစ်ခု ပေးခြင်းဖြင့် ကျပန်းနံပါတ်အမျိုးအနွယ်ကို ပြုပြင်နိုင်ပြီး ကျပန်းနံပါတ် ဂျင်နရေတာကို စတင်နိုင်ပါသည်။

တူညီသောမျိုးစေ့ဖြင့် အစပြုပြီးနောက်၊ ဒြပ်စင်များကို အမြဲတမ်း တူညီသောနည်းလမ်းဖြင့် ရွေးချယ်သည်။

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3