Избор, узорак и избори за насумично бирање елемената са листе у Питхон-у.

Бусинесс

Функције цхоице(), сампле() и цхоицес() у насумичном модулу Питхон стандардне библиотеке могу се користити за насумично бирање и преузимање елемената са листе, тупле, стринга или другог објекта секвенце (случајно узорковање).

цхоице() добија један елемент, сампле() и цхоицес() добијају листу више елемената. сампле() је екстракција која се не може повратити без дупликата, цхоицес() је екстракција која се може вратити са дупликатима.

Овде се налазе следеће информације.

  • Изаберите један елемент насумично.:random.choice()
  • Насумично изаберите више елемената (без дупликата):random.sample()
  • Насумично изаберите више елемената (са дупликатима):random.choices()
  • Поправи семе насумичних бројева

Изаберите један елемент насумично.:random.choice()

Са функцијом селецт() модула рандом, један елемент се насумично бира са листе и може се преузети.

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']

Ако желите да се вратите на тупле или стринг, користите тупле(),јоин().

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]

Ако желите да избегнете дупле вредности, можете користити сет() да га конвертујете у скуп (тип скупа) и издвојите само јединствене елементе, а затим користите сампле().

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

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

Насумично изаберите више елемената (са дупликатима):random.choices()

Функција избора() рандом модула омогућава вам да насумично преузмете више елемената са листе, и за разлику од сампле(), дозвољава да се изаберу дупли елементи.

цхоицес() је функција додата у Питхон 3.6. Није доступан у ранијим верзијама.

Аргумент к специфицира број елемената који се преузимају. Дуплицирање је дозвољено, тако да број елемената који се преузимају може бити већи од броја елемената у оригиналној листи.

Пошто је к аргумент само за кључну реч, потребно је навести кључну реч, као што је к=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]

Подразумевана вредност к је 1; ако је изостављен, враћа се листа са 1 елементом.

print(random.choices(l))
# [1]

Тежине аргумената се могу користити за одређивање тежине (вероватноће) да ће сваки елемент бити изабран, а тип елемената на листи може бити инт или флоат.

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]

Аргумент цум_веигхтс се такође може навести као кумулативна тежина. цум_веигхтс у следећем узорку кода је еквивалентан првим тежинама изнад.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

Подразумевана вредност за тежине аргумената и цум_веигхтс је Ништа, што значи да је сваки елемент изабран са истом вероватноћом.

Ако се дужина (број елемената) тежине аргумената или цум_веигхтс разликује од оригиналне листе, долази до грешке.

# 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

До сада смо навели листу као први аргумент као пример у узорку кода, али исто важи и за тупле и стрингове.

Поправи семе насумичних бројева

Давањем произвољног целог броја функцији сеед(), сеед насумичних бројева може бити фиксиран и генератор случајних бројева може бити иницијализован.

Након иницијализације са истим семеном, елементи се увек бирају на исти начин.

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

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