Выбар, узор і варыянты для выпадковага выбару элементаў са спісу ў Python.

Бізнэс

Функцыі choice(), sample() і choices() у модулі random стандартнай бібліятэкі Python можна выкарыстоўваць для выпадковага выбару і атрымання элементаў са спісу, картэжа, радка або іншага аб’екта паслядоўнасці (выпадковая выбарка).

choice() атрымлівае адзін элемент, sample() і choices() атрымлівае спіс з некалькіх элементаў. sample() з’яўляецца неаднаўляльным здабываннем без дублікатаў, choices() з’яўляецца аднаўляльным здабываннем з дублікатамі.

Тут прадстаўлена наступная інфармацыя.

  • Выберыце адзін элемент выпадковым чынам.: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() модуля random вы можаце атрымаць некалькі элементаў у выпадковым парадку са спісу. Адсутнічае дубляванне элементаў (выманне, якое не падлягае аднаўленню).

Першы аргумент – гэта спіс, а другі – колькасць элементаў, якія трэба атрымаць. Спіс вяртаецца.

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

Функцыя выпадковага модуля choices() дазваляе здабываць некалькі элементаў у выпадковым парадку са спісу, і ў адрозненне ад sample(), яна дазваляе выбіраць паўтаральныя элементы.

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

Да гэтага часу мы паказалі спіс у якасці першага аргумента ў якасці прыкладу ў прыкладзе кода, але тое ж самае ставіцца да картэжаў і радкоў.

Выпраўце насенне выпадковых лікаў

Даючы адвольнае цэлае лік у функцыю seed() выпадковага модуля), можна зафіксаваць выпадковы лік, а генератар выпадковых лікаў можна ініцыялізаваць.

Пасля ініцыялізацыі адным і тым жа насенным элементам элементы заўсёды выбіраюцца аднолькава.

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

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