Pagpili, sample, at mga pagpipilian upang random na pumili ng mga elemento mula sa isang listahan sa Python.

Negosyo

Ang mga function choice(), sample(), at choices() sa random module ng Python standard library ay maaaring gamitin upang random na pumili at kunin ang mga elemento mula sa isang listahan, tuple, string, o iba pang sequence object (random sampling).

choice() ay nakakakuha ng isang elemento, sample() at choices() makakuha ng listahan ng maraming elemento. sample() ay non-recoverable extraction na walang duplicate, choices() ay recoverable extraction na may mga duplicate.

Ang sumusunod na impormasyon ay ibinigay dito.

  • Pumili ng isang elemento nang random.:random.choice()
  • Random na pumili ng maraming elemento (walang mga duplicate):random.sample()
  • Random na pumili ng maraming elemento (na may mga duplicate):random.choices()
  • Ayusin ang random number seed

Pumili ng isang elemento nang random.:random.choice()

Gamit ang function ng random na module na choose(), ang isang elemento ay random na pinili mula sa listahan at maaaring makuha.

import random

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

print(random.choice(l))
# 1

Ang parehong naaangkop sa tuples at string. Sa kaso ng mga string, isang solong character ang pipiliin.

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

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

Error kung ang isang walang laman na listahan, tuple, o string ay tinukoy bilang isang argumento.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

Random na pumili ng maraming elemento (walang mga duplicate):random.sample()

Gamit ang sample ng function() ng random na module, maaari kang makakuha ng maraming elemento nang random mula sa isang listahan. Walang duplikasyon ng mga elemento (non-recoverable extraction).

Ang unang argumento ay isang listahan, at ang pangalawang argumento ay ang bilang ng mga elementong kukunin. Ibinalik ang listahan.

import random

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

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

Kung ang pangalawang argumento ay nakatakda sa 1, ang isang listahan na may isang elemento ay ibabalik din; kung ito ay nakatakda sa 0, ang listahan ay walang laman. Kung ang pangalawang argumento ay 1, isang listahan na may isang elemento ay ibabalik; kung ito ay 0, isang walang laman na listahan ang ibinalik; kung ang unang argumento ay higit pa sa bilang ng mga elemento sa listahan, magkakaroon ng error.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

Kung ang unang argumento ay isang tuple o isang string, kung ano ang ibinalik ay isang listahan pa rin.

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

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

Kung gusto mong bumalik sa isang tuple o string, gamitin ang tuple(),join().

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

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

Tandaan na ang halaga ay hindi hinuhusgahan, kaya kung ang orihinal na listahan o tuple ay naglalaman ng mga elemento na may parehong halaga, may posibilidad na ang parehong halaga ay pipiliin.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

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

Kung nais mong maiwasan ang mga dobleng halaga, maaari mong gamitin ang set() upang i-convert ito sa isang set (uri ng set) at i-extract lamang ang mga natatanging elemento, at pagkatapos ay gumamit ng sample().

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

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

Random na pumili ng maraming elemento (na may mga duplicate):random.choices()

Ang mga pagpipilian sa pag-andar ng random na module () ay nagbibigay-daan sa iyo na kunin ang maraming elemento nang random mula sa isang listahan, at hindi tulad ng sample (), pinapayagan ka nitong pumili ng mga dobleng elemento.

choices() ay isang function na idinagdag sa Python 3.6. Hindi ito magagamit sa mga naunang bersyon.

Tinutukoy ng argumentong k ang bilang ng mga elementong kukunin. Pinapayagan ang pagdoble, kaya ang bilang ng mga elementong kukunin ay maaaring mas malaki kaysa sa bilang ng mga elemento sa orihinal na listahan.

Dahil ang k ay isang keyword-only na argumento, kinakailangang tumukoy ng keyword, gaya ng 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]

Ang default na halaga ng k ay 1; kung ito ay tinanggal, isang listahan na may 1 elemento ay ibabalik.

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

Maaaring gamitin ang mga weight ng argument upang tukuyin ang timbang (probability) na pipiliin ang bawat elemento, at ang uri ng mga elemento sa listahan ay maaaring int o 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]

Ang argumentong cum_weights ay maaari ding tukuyin bilang pinagsama-samang timbang. Ang cum_weights sa sumusunod na sample code ay katumbas ng mga unang timbang sa itaas.

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

Ang default para sa parehong mga argumento weights at cum_weights ay Wala, na nangangahulugan na ang bawat elemento ay pinili na may parehong posibilidad.

Kung ang haba (bilang ng mga elemento) ng argument weights o cum_weights ay iba sa orihinal na listahan, magkakaroon ng error.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

Ito rin ay isang error upang tukuyin ang mga timbang at cum_weights sa parehong oras.

# 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

Tinukoy namin ang isang listahan bilang unang argumento bilang isang halimbawa sa sample code sa ngayon, ngunit ang parehong naaangkop sa mga tuple at string.

Ayusin ang random number seed

Sa pamamagitan ng pagbibigay ng arbitrary integer sa random module’s function seed(), ang random number seed ay maaaring maayos at ang random number generator ay maaaring masimulan.

Pagkatapos ng pagsisimula sa parehong binhi, ang mga elemento ay palaging pinipili sa parehong paraan.

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

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