Izbor, uzorak i izbori za nasumični odabir elemenata s popisa u Pythonu.

Poslovanje

Funkcije choice(), sample() i choices() u random modulu standardne biblioteke Python mogu se koristiti za nasumični odabir i dohvaćanje elemenata s popisa, torke, niza ili drugog objekta sekvence (slučajno uzorkovanje).

choice() dobiva jedan element, sample() i choices() dobivaju popis više elemenata. sample() je nepovratna ekstrakcija bez duplikata, choices() je nadoknadiva ekstrakcija s duplikatima.

Ovdje su navedene sljedeće informacije.

  • Odaberite jedan element nasumično.:random.choice()
  • Nasumično odaberite više elemenata (bez duplikata):random.sample()
  • Nasumično odaberite više elemenata (s duplikatima):random.choices()
  • Popravite nasumični broj

Odaberite jedan element nasumično.:random.choice()

Uz funkciju select() modula random, jedan element se nasumično odabire s popisa i može se dohvatiti.

import random

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

print(random.choice(l))
# 1

Isto vrijedi i za tuple i nizove. U slučaju nizova, odabire se jedan znak.

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

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

Pogreška ako je prazan popis, tuple ili niz naveden kao argument.

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

Nasumično odaberite više elemenata (bez duplikata):random.sample()

S funkcijom sample() random modula, možete nasumično dobiti više elemenata s popisa. Nema dupliciranja elemenata (nepovratna ekstrakcija).

Prvi argument je popis, a drugi argument je broj elemenata koji se trebaju dohvatiti. Popis se vraća.

import random

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

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

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

Ako je drugi argument postavljen na 1, također se vraća popis s jednim elementom; ako je postavljeno na 0, popis je prazan. Ako je drugi argument 1, vraća se popis s jednim elementom; ako je 0, vraća se prazna lista; ako je prvi argument veći od broja elemenata na popisu, dolazi do pogreške.

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

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

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

Ako je prvi argument tuple ili niz, ono što se vraća je još uvijek popis.

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

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

Ako se želite vratiti na tuple ili niz, koristite tuple(),join().

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

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

Imajte na umu da se vrijednost ne ocjenjuje, pa ako izvorni popis ili tuple sadrži elemente s istom vrijednošću, postoji mogućnost da će biti odabrana ista vrijednost.

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

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

Ako želite izbjeći duple vrijednosti, možete koristiti set() da ga pretvorite u skup (vrsta skupa) i izdvojite samo jedinstvene elemente, a zatim upotrijebite sample().

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

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

Nasumično odaberite više elemenata (s duplikatima):random.choices()

Funkcija choices() modula random omogućuje vam da nasumično dohvatite više elemenata s popisa, a za razliku od sample(), dopušta odabir dupliciranih elemenata.

choices() je funkcija dodana u Python 3.6. Nije dostupan u ranijim verzijama.

Argument k specificira broj elemenata koji će se dohvatiti. Umnožavanje je dopušteno, tako da broj elemenata za dohvat može biti veći od broja elemenata na izvornom popisu.

Budući da je k argument samo za ključnu riječ, potrebno je navesti ključnu riječ, kao što je 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]

Zadana vrijednost k je 1; ako je izostavljen, vraća se popis s 1 elementom.

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

Ponderi argumenata mogu se koristiti za određivanje težine (vjerojatnosti) da će svaki element biti odabran, a tip elemenata na popisu može biti int ili 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 također se može navesti kao kumulativna težina. cum_weights u sljedećem uzorku koda ekvivalentan je prvim ponderima iznad.

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

Zadana vrijednost za težine argumenata i cum_weights je Ništa, što znači da je svaki element odabran s istom vjerojatnošću.

Ako se duljina (broj elemenata) težine argumenata ili cum_weights razlikuje od izvornog popisa, dolazi do pogreške.

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

Također je pogreška navesti težine i cum_weights u isto vrijeme.

# 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

Naveli smo popis kao prvi argument kao primjer u uzorku koda do sada, ali isto vrijedi i za torke i nizove.

Popravite nasumični broj

Davanjem proizvoljnog cijelog broja funkciji seed(), seed nasumičnih brojeva može se fiksirati i generator slučajnih brojeva se može inicijalizirati.

Nakon inicijalizacije s istim sjemenom, elementi se uvijek biraju na isti način.

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

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