Chaguo, sampuli, na chaguzi za kuchagua kwa nasibu vitu kutoka kwa orodha kwenye Python.

Biashara

Chaguo za chaguo za kukokotoa (), sampuli (), na chaguo() katika moduli ya nasibu ya maktaba ya kawaida ya Python inaweza kutumika kwa nasibu kuchagua na kurejesha vipengele kutoka kwa orodha, tuple, kamba, au kitu kingine cha mfuatano (sampuli nasibu).

choice() hupata kipengele kimoja, sample() na choices() pata orodha ya vitu vingi. sample() ni uchimbaji usioweza kurejeshwa bila nakala, choices() ni uchimbaji unaoweza kurejeshwa na nakala.

Habari ifuatayo imetolewa hapa.

  • Chagua kipengele kimoja bila mpangilio.:random.choice()
  • Chagua vitu vingi bila mpangilio (hakuna nakala):random.sample()
  • Chagua bila mpangilio vitu vingi (na nakala):random.choices()
  • Rekebisha mbegu ya nambari nasibu

Chagua kipengele kimoja bila mpangilio.:random.choice()

Na chaguo la kukokotoa la moduli nasibu select(), kipengele kimoja kinachaguliwa kwa nasibu kutoka kwenye orodha na kinaweza kupatikana tena.

import random

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

print(random.choice(l))
# 1

Vile vile hutumika kwa tuples na masharti. Katika kesi ya masharti, tabia moja huchaguliwa.

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

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

Hitilafu ikiwa orodha tupu, tuple, au kamba imebainishwa kama hoja.

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

Chagua vitu vingi bila mpangilio (hakuna nakala):random.sample()

Ukiwa na sampuli ya kazi () ya moduli ya nasibu, unaweza kupata vipengele vingi bila mpangilio kutoka kwa orodha. Hakuna marudio ya vipengele (uchimbaji usioweza kurejeshwa).

Hoja ya kwanza ni orodha, na hoja ya pili ni idadi ya vipengele vinavyopaswa kurejeshwa. Orodha imerudishwa.

import random

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

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

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

Ikiwa hoja ya pili imewekwa kuwa 1, orodha iliyo na kipengele kimoja pia inarudishwa; ikiwa imewekwa kuwa 0, orodha ni tupu. Ikiwa hoja ya pili ni 1, orodha iliyo na kipengele kimoja inarudishwa; ikiwa ni 0, orodha tupu inarudishwa; ikiwa hoja ya kwanza ni zaidi ya idadi ya vipengele kwenye orodha, hitilafu hutokea.

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

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

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

Ikiwa hoja ya kwanza ni tuple au mfuatano, kinachorejeshwa bado ni orodha.

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

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

Ikiwa ungependa kurudi kwenye tuple au kamba, tumia tuple(), join().

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

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

Kumbuka kwamba thamani haihukumiwi, kwa hivyo ikiwa orodha asili au nakala ina vipengee vyenye thamani sawa, kuna uwezekano kwamba thamani sawa itachaguliwa.

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

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

Ikiwa unataka kuzuia maadili yanayorudiwa, unaweza kutumia set() kuibadilisha kuwa seti (seti ya aina) na kutoa tu vipengee vya kipekee, na kisha utumie sample().

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

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

Chagua bila mpangilio vitu vingi (na nakala):random.choices()

Chaguo za utendakazi za moduli nasibu() hukuruhusu kupata vipengee vingi bila mpangilio kutoka kwa orodha, na tofauti na sampuli(), inaruhusu vipengee nakala kuchaguliwa.

choices() ni kazi iliyoongezwa katika Python 3.6. Haipatikani katika matoleo ya awali.

Hoja k inabainisha idadi ya vipengele vya kurejeshwa. Rudufu inaruhusiwa, kwa hivyo idadi ya vipengee vya kurejeshwa inaweza kuwa kubwa kuliko idadi ya vipengee kwenye orodha asili.

Kwa kuwa k ni hoja ya neno-msingi pekee, ni muhimu kutaja neno kuu, kama vile 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]

Thamani chaguo-msingi ya k ni 1; ikiwa imeachwa, orodha iliyo na kipengele 1 inarudishwa.

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

Mizani ya hoja inaweza kutumika kubainisha uzito (uwezekano) kwamba kila kipengele kitachaguliwa, na aina ya vipengele kwenye orodha vinaweza kuwa int au kuelea.

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]

Hoja cum_weights pia inaweza kubainishwa kama uzito limbikizi. Cum_weights katika sampuli ya msimbo ifuatayo ni sawa na uzani wa kwanza hapo juu.

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

Chaguo msingi kwa uzani wa hoja zote mbili na cum_weights ni Hakuna, ambayo inamaanisha kuwa kila kipengele kimechaguliwa kwa uwezekano sawa.

Ikiwa urefu (idadi ya vipengele) vya uzani wa hoja au cum_weights ni tofauti na orodha ya asili, hitilafu hutokea.

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

Pia ni kosa kutaja uzani na cum_weights kwa wakati mmoja.

# 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

Tumebainisha orodha kama hoja ya kwanza kama mfano katika sampuli ya msimbo kufikia sasa, lakini hiyo hiyo inatumika kwa nakala na mifuatano.

Rekebisha mbegu ya nambari nasibu

Kwa kutoa nambari kamili kiholela kwa seed(), nambari nasibu ya nambari inaweza kusasishwa na jenereta ya nambari nasibu inaweza kuanzishwa.

Baada ya kuanzishwa kwa mbegu sawa, vipengele huchaguliwa kila mara kwa njia ile ile.

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

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