Izbira, vzorec in izbire za naključno izbiro elementov s seznama v programu Python.

Posel

Funkcije choice(), sample() in choices() v modulu random standardne knjižnice Python lahko uporabite za naključno izbiranje in pridobivanje elementov iz seznama, tupla, niza ali drugega zaporedja (naključno vzorčenje).

funkcija choice() dobi en sam element, funkciji sample() in choices() pa seznam več elementov. funkcija sample() je neobnovljivo izločanje brez podvojitev, funkcija choices() je obnovljivo izločanje s podvojitvami.

Tu so na voljo naslednje informacije.

  • Naključno izberite en element.: random.choice()
  • Naključno izberite več elementov (brez podvojitev): random.sample()
  • Naključno izberite več elementov (z dvojniki): random.choices()
  • Določite seme naključne številke

Naključno izberite en element.: random.choice()

S funkcijo choose() modula random se s seznama naključno izbere en element, ki ga je mogoče priklicati.

import random

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

print(random.choice(l))
# 1

Enako velja za nizovnike in nizove. Pri nizih se izbere en sam znak.

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

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

Napaka, če je kot argument naveden prazen seznam, tuple ali niz.

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

Naključno izberite več elementov (brez podvojitev): random.sample()

S funkcijo sample() modula random lahko iz seznama naključno pridobite več elementov. Pri tem ni podvajanja elementov (nepovratno pridobivanje).

Prvi argument je seznam, drugi argument pa število elementov, ki jih je treba pridobiti. Seznam se vrne.

import random

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

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

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

Če je drugi argument nastavljen na 1, se prav tako vrne seznam z enim elementom; če je nastavljen na 0, je seznam prazen. Če je drugi argument enak 1, se vrne seznam z enim elementom; če je enak 0, se vrne prazen seznam; če je prvi argument večji od števila elementov na seznamu, se pojavi napaka.

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

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

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

Če je prvi argument tuple ali niz, je vrnjen seznam.

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

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

Če se želite vrniti v tuple ali niz, uporabite tuple(),join().

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

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

Upoštevajte, da se vrednost ne ocenjuje, zato obstaja možnost, da bo izbrana ista vrednost, če prvotni seznam ali niz vsebuje elemente z enako vrednostjo.

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

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

Če se želite izogniti podvojenim vrednostim, ga lahko s funkcijo set() pretvorite v množico (tip množice) in izločite samo edinstvene elemente, nato pa uporabite funkcijo sample().

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

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

Naključno izberite več elementov (z dvojniki): random.choices()

Funkcija choices() modula random omogoča naključno pridobivanje več elementov s seznama in za razliko od funkcije sample() omogoča izbiro podvojenih elementov.

choices() je funkcija, dodana v Pythonu 3.6. V prejšnjih različicah ni na voljo.

Argument k določa število elementov, ki jih je treba pridobiti. Dovoljeno je podvajanje, zato je lahko število elementov, ki jih je treba pridobiti, večje od števila elementov v prvotnem seznamu.

Ker je k argument samo za ključno besedo, je treba navesti ključno besedo, na primer 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]

Privzeta vrednost k je 1; če jo izpustite, se vrne seznam z 1 elementom.

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

Z argumentom uteži lahko določite utež (verjetnost), da bo vsak element izbran, tip elementov na seznamu pa je lahko int ali 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]

Argument cum_weights je lahko določen tudi kot kumulativna utež. Parameter cum_weights v naslednjem vzorcu kode je enakovreden prvim utežem zgoraj.

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

Privzeta vrednost za argumenta weights in cum_weights je None, kar pomeni, da je vsak element izbran z enako verjetnostjo.

Če se dolžina (število elementov) argumenta weights ali cum_weights razlikuje od prvotnega seznama, pride do napake.

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

Prav tako je napaka, če hkrati navedete uteži in 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

V dosedanjem vzorcu kode smo kot prvi argument kot primer navedli seznam, enako pa velja tudi za nize in vrstice.

Določite seme naključne številke

S podajanjem poljubnega celega števila funkciji seed() modula random lahko določite seme naključnega števila in inicializirate generator naključnih števil.

Po inicializaciji z istim semenom so elementi vedno izbrani na enak način.

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

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