Aðgerðirnar choice(), sample() og choices() í slembieiningu Python staðalsafnsins er hægt að nota til að velja og sækja þætti af handahófi úr lista, tuple, streng eða öðrum röð hlut (slembiúrtak).
choice() fær einn stak, sample() og choices() fá lista yfir marga þætti. sample() er útdráttur sem ekki er hægt að endurheimta án afrita, choices() er endurheimtanlegur útdráttur með afritum.
Eftirfarandi upplýsingar eru veittar hér.
- Veldu einn þátt af handahófi.:
random.choice()
- Veldu marga þætti af handahófi (engar afrit):
random.sample()
- Veldu marga þætti af handahófi (með afritum):
random.choices()
- Lagaðu slembitölufræið
Veldu einn þátt af handahófi.:random.choice()
Með aðgerðinni velja() tilviljunarkenndu einingarinnar er einn þáttur valinn af handahófi af listanum og hægt er að sækja hann.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Sama á við um túpa og strengi. Ef um er að ræða strengi er einn stafur valinn.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Villa ef tómur listi, tuple eða strengur er tilgreindur sem viðfangsefni.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Veldu marga þætti af handahófi (engar afrit):random.sample()
Með fallinu sample() slembieiningarinnar geturðu fengið marga þætti af handahófi af lista. Það er engin fjölföldun á þáttum (óendurheimtanlegur útdráttur).
Fyrsta röksemdin er listi og seinni röksemdin er fjöldi þátta sem á að sækja. Listanum er skilað.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Ef seinni röksemdin er stillt á 1, er listi með einum staki einnig skilað; ef það er stillt á 0 er listinn tómur. Ef seinni röksemdin er 1 er listi með einum staki skilað; ef það er 0, er tómur listi skilaður; ef fyrstu röksemdin er fleiri en fjöldi þátta á listanum kemur villa.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Ef fyrsta rökin er tuple eða strengur, er það sem skilað er enn listi.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Ef þú vilt fara aftur í tuple eða streng, notaðu tuple(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Athugaðu að gildið er ekki dæmt, þannig að ef upprunalegi listinn eða túllinn inniheldur þætti með sama gildi er möguleiki á að sama gildi verði valið.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Ef þú vilt forðast tvöföld gildi geturðu notað set() til að umbreyta því í mengi (tegund setts) og draga aðeins út einstöku þættina og síðan notað sample().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Veldu marga þætti af handahófi (með afritum):random.choices()
Valkostir slembieiningarinnar () gerir þér kleift að sækja marga þætti af handahófi af lista og ólíkt sample() gerir það kleift að velja tvítekna þætti.
choices() er fall sem bætt er við í Python 3.6. Það er ekki fáanlegt í fyrri útgáfum.
Röksemdin k tilgreinir fjölda þátta sem á að sækja. Fjölföldun er leyfð, þannig að fjöldi þátta sem á að sækja getur verið stærri en fjöldi þátta í upprunalega listanum.
Þar sem k er röksemdafærsla eingöngu fyrir leitarorð er nauðsynlegt að tilgreina lykilorð, eins og 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]
Sjálfgefið gildi k er 1; ef því er sleppt er listi með 1 staki skilað.
print(random.choices(l))
# [1]
Hægt er að nota rökstuðningsþyngdina til að tilgreina þyngd (líkur) á því að hver þáttur verði valinn og tegund þáttanna á listanum getur verið int eða flot.
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]
Einnig er hægt að tilgreina röksemdina cum_weights sem uppsafnað vægi. Cum_weights í eftirfarandi sýniskóða jafngilda fyrstu lóðunum hér að ofan.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Sjálfgefið fyrir bæði frumbreyturnar vægi og cum_weights er Enginn, sem þýðir að hver þáttur er valinn með sömu líkum.
Ef lengd (fjöldi þátta) vægi röksemda eða cum_weights er frábrugðin upprunalega listanum, kemur villa.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Það er líka villa að tilgreina þyngd og cum_weights á sama tíma.
# 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
Við höfum tilgreint lista sem fyrstu rök sem dæmi í sýnishornskóðanum hingað til, en það sama á við um túlla og strengi.
Lagaðu slembitölufræið
Með því að gefa handahófskennda heiltölu fyrir virkni slembieiningarinnar seed(), er hægt að laga slembitölukornið og frumstilla slembitöluframleiðandann.
Eftir frumstillingu með sama fræi eru þættirnir alltaf valdir á sama hátt.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3