Python стандарт номын сангийн санамсаргүй модуль дахь сонголт(), sample(), сонголт() функцуудыг жагсаалт, залгуур, мөр эсвэл бусад дарааллын объектоос (санамсаргүй түүвэрлэлт) санамсаргүй байдлаар сонгож, сэргээхэд ашиглаж болно.
option() нь нэг элемент, sample() болон options() нь олон элементийн жагсаалтыг авна. sample() нь хуулбаргүй, нөхөн сэргээх боломжгүй олборлолт, options() нь давхардсан хуулбар бүхий нөхөн сэргээх боломжтой олборлолт юм.
Энд дараах мэдээллийг хүргэж байна.
- Санамсаргүй байдлаар нэг элемент сонгоно уу.:
random.choice()
- Олон элементийг санамсаргүй байдлаар сонгох (давхардсан зүйл байхгүй):
random.sample()
- Олон элементийг санамсаргүй байдлаар сонгох (давхардсан):
random.choices()
- Санамсаргүй тооны үрийг засах
Санамсаргүй байдлаар нэг элемент сонгоно уу.:random.choice()
Санамсаргүй модулийн select() функцийн тусламжтайгаар жагсаалтаас нэг элементийг санамсаргүй байдлаар сонгож, буцааж авах боломжтой.
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
Хоосон жагсаалт, хэлхээ эсвэл мөрийг аргумент болгон зааж өгсөн бол алдаа гарна.
# 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 эсвэл стринг рүү буцахыг хүсвэл 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()-г ашиглан олонлог (багцын төрөл) болгон хувиргаж, зөвхөн өвөрмөц элементүүдийг задалж, дараа нь sample()-г ашиглаж болно.
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Олон элементийг санамсаргүй байдлаар сонгох (давхардсан):random.choices()
Санамсаргүй модулийн функцийн сонголтууд() нь жагсаалтаас санамсаргүй байдлаар олон элементийг татах боломжийг олгодог бөгөөд sample()-ээс ялгаатай нь давхардсан элементүүдийг сонгох боломжийг олгодог.
options() нь 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]
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_
Мөн жин болон жинг нэгэн зэрэг зааж өгсөн нь алдаа юм.
# 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() функцэд дурын бүхэл тоо өгснөөр санамсаргүй тооны үрийг засч, санамсаргүй тоо үүсгэгчийг эхлүүлж болно.
Нэг үрээр эхлүүлсний дараа элементүүдийг үргэлж ижил аргаар сонгодог.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3