Valik, valim ja valikud, et valida juhuslikult elemente nimekirjast Pythonis.

Äri

Pythoni standardraamatukogu juhusliku mooduli funktsioone choice(), sample() ja choices() saab kasutada elementide juhuslikuks valimiseks ja kättesaamiseks loendist, tuplist, stringist või muust järjestuse objektist (juhuslik valik).

choice() saab ühe elemendi, sample() ja choices() saavad mitme elemendi loendi. sample() on taastamatu väljavõte ilma duplikaatideta, choices() on taastatav väljavõte koos duplikaatidega.

Siin on esitatud järgmine teave.

  • Valige juhuslikult üks element.: random.choice()
  • Valige juhuslikult mitu elementi (ilma dubleerimisteta).: random.sample()
  • Valige juhuslikult mitu elementi (koos duplikaatidega): random.choices()
  • Juhusliku arvu seemne fikseerimine

Valige juhuslikult üks element.: random.choice()

Juhusliku mooduli funktsiooni choose() abil valitakse loendist juhuslikult üks element, mille saab välja võtta.

import random

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

print(random.choice(l))
# 1

Sama kehtib ka tuplite ja stringide kohta. Stringide puhul valitakse üks täht.

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

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

Viga, kui argumendina on määratud tühi loend, tupel või string.

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

Valige juhuslikult mitu elementi (ilma dubleerimisteta).: random.sample()

Juhusliku mooduli funktsiooni sample() abil saab loendist mitu elementi juhuslikult välja võtta. Elementide dubleerimist ei toimu (taastumatu väljavõtte).

Esimene argument on nimekiri ja teine argument on välja otsitavate elementide arv. Tagastatakse nimekiri.

import random

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

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

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

Kui teise argumendi väärtuseks on 1, tagastatakse samuti ühe elemendiga nimekiri; kui selle väärtuseks on 0, on nimekiri tühi. Kui teine argument on 1, tagastatakse ühe elemendiga nimekiri; kui see on 0, tagastatakse tühi nimekiri; kui esimene argument on suurem kui nimekirjas olevate elementide arv, tekib viga.

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

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

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

Kui esimene argument on tupel või string, siis tagastatakse ikkagi nimekiri.

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

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

Kui soovite naasta tuple'ile või stringile, kasutage tuple(),join().

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

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

Pange tähele, et väärtust ei hinnata, nii et kui algne loend või tupel sisaldab sama väärtusega elemente, on võimalik, et sama väärtus valitakse.

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

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

Kui soovite vältida dubleerivaid väärtusi, võite kasutada funktsiooni set(), et teisendada see komplektiks (komplekstüübiks) ja eraldada ainult unikaalsed elemendid ning seejärel kasutada funktsiooni sample().

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

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

Valige juhuslikult mitu elementi (koos duplikaatidega): random.choices()

Juhusliku mooduli funktsioon choices() võimaldab saada loendist mitu elementi juhuslikult ja erinevalt sample() võimaldab see valida dubleeritud elemente.

choices() on Python 3.6-s lisatud funktsioon. Varasemates versioonides see funktsioon ei ole saadaval.

Argument k määrab välja otsitavate elementide arvu. Duplikatsioon on lubatud, seega võib välja otsitavate elementide arv olla suurem kui algse nimekirja elementide arv.

Kuna k on ainult võtmesõnaline argument, on vaja määrata võtmesõna, näiteks 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]

Vaikimisi on k väärtus 1; kui see jäetakse välja, tagastatakse 1 elemendiga nimekiri.

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

Argumendiga weights saab määrata kaalu (tõenäosuse), et iga element valitakse, ja nimekirja elementide tüübiks võib olla int või 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]

Argumendi cum_weights võib määrata ka kumulatiivse kaaluna. Järgmise näidiskoodi cum_weights on samaväärne eespool esitatud esimese kaaluga.

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

Vaikimisi on nii argumentide weights kui ka cum_weights puhul olematu, mis tähendab, et iga element valitakse sama tõenäosusega.

Kui argumendi weights või cum_weights pikkus (elementide arv) erineb algsest nimekirjast, tekib viga.

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

Samuti on viga kaalude ja cum_kaalude samaaegne määramine.

# 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

Oleme senises näidiskoodis näitena esimese argumendina määranud nimekirja, kuid sama kehtib ka tuplite ja stringide kohta.

Juhusliku arvu seemne fikseerimine

Andes juhusliku mooduli funktsioonile seed() suvalise täisarvu, saab juhusliku arvu seemne fikseerida ja juhusliku arvu generaatori initsialiseerida.

Pärast initsialiseerimist sama seemnega valitakse elemendid alati samamoodi.

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

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