Python стандартты кітапханасының кездейсоқ модуліндегі choice(), sample() және options() функцияларын тізімнен, кортежнен, жолдан немесе басқа реттілік нысанынан (кездейсоқ іріктеу) кездейсоқ таңдау және алу үшін пайдалануға болады.
Choice() бір элементті алады, 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
Бұл кортеждер мен жолдарға да қатысты. Жолдар жағдайында бір таңба таңдалады.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Бос тізім, кортеж немесе жол аргумент ретінде көрсетілсе, қате.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Бірнеше элементтерді кездейсоқ таңдау (қайталанбауы):random.sample()
Кездейсоқ модульдің 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(), 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 немесе 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 аргументтері үшін әдепкі мән Жоқ болып табылады, бұл әрбір элемент бірдей ықтималдықпен таңдалғанын білдіреді.
Аргумент салмағының немесе 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() функциясына ерікті бүтін сан беру арқылы кездейсоқ сандар тұқымын бекітуге және кездейсоқ сандар генераторын инициализациялауға болады.
Бір тұқыммен инициализациядан кейін элементтер әрқашан бірдей таңдалады.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3