انتخاب، نمونه و انتخاب برای انتخاب تصادفی عناصر از یک لیست در پایتون.

کسب و کار

توابع option()، sample() و options() در ماژول تصادفی کتابخانه استاندارد پایتون می توانند برای انتخاب و بازیابی تصادفی عناصر از یک لیست، تاپل، رشته یا دیگر شی دنباله ای (نمونه گیری تصادفی) استفاده شوند.

Choice() یک عنصر واحد، sample() و options() لیستی از چندین عنصر را دریافت می کند. نمونه () استخراج غیر قابل بازیابی و بدون تکرار است، options() استخراج قابل بازیابی با موارد تکراری است.

اطلاعات زیر در اینجا ارائه شده است.

  • یک عنصر را به صورت تصادفی انتخاب کنید.:random.choice()
  • انتخاب تصادفی چندین عنصر (بدون تکرار):random.sample()
  • انتخاب تصادفی چندین عنصر (با موارد تکراری):random.choices()
  • دانه اعداد تصادفی را ثابت کنید

یک عنصر را به صورت تصادفی انتخاب کنید.:random.choice()

با تابع ماژول تصادفی select()، یک عنصر به طور تصادفی از لیست انتخاب می شود و می توان آن را بازیابی کرد.

import random

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

print(random.choice(l))
# 1

همین امر در مورد تاپل ها و رشته ها نیز صدق می کند. در مورد رشته ها، یک کاراکتر انتخاب می شود.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

اگر یک لیست خالی، تاپل یا رشته به عنوان آرگومان مشخص شده باشد، خطا دارد.

# 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

اگر آرگومان اول یک تاپل یا یک رشته باشد، چیزی که برگردانده می شود همچنان یک لیست است.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

اگر می خواهید به یک tuple یا رشته برگردید، از ()tuple(),join() استفاده کنید.

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

توجه داشته باشید که مقدار مورد قضاوت قرار نمی گیرد، بنابراین اگر لیست یا تاپل اصلی حاوی عناصری با همان مقدار باشد، امکان انتخاب همان مقدار وجود دارد.

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) استفاده کنید و فقط عناصر منحصربه‌فرد را استخراج کنید و سپس از نمونه () استفاده کنید.

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

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

انتخاب تصادفی چندین عنصر (با موارد تکراری):random.choices()

تابع ()Options ماژول تصادفی به شما این امکان را می دهد که چندین عنصر را به صورت تصادفی از یک لیست بازیابی کنید، و برخلاف نمونه ()، امکان انتخاب عناصر تکراری را فراهم می کند.

()Options تابعی است که در پایتون 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]

پیش فرض برای هر دو آرگومان weights و 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

ما یک لیست را به عنوان اولین آرگومان به عنوان نمونه در کد نمونه تا کنون مشخص کرده ایم، اما همین امر در مورد تاپل ها و رشته ها صدق می کند.

دانه اعداد تصادفی را ثابت کنید

با دادن یک عدد صحیح دلخواه به تابع seed() ماژول تصادفی، می توان seed اعداد تصادفی را ثابت کرد و مولد اعداد تصادفی را می توان مقدار دهی اولیه کرد.

پس از مقداردهی اولیه با همان seed، عناصر همیشه به همین ترتیب انتخاب می شوند.

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

random.seed(0)
print(random.choice(l))
# 3
Copied title and URL