Alegere, eșantionare și alegeri pentru a selecta aleatoriu elemente dintr-o listă în Python.

Afaceri

Funcțiile choice(), sample() și choices() din modulul random al bibliotecii standard Python pot fi utilizate pentru a selecta și a prelua în mod aleatoriu elemente dintr-o listă, tuple, șir de caractere sau alt obiect secvență (eșantionare aleatorie).

choice() obține un singur element, sample() și choices() obțin o listă de mai multe elemente. sample() este o extracție nerecuperabilă fără duplicate, iar choices() este o extracție recuperabilă cu duplicate.

Aici sunt furnizate următoarele informații.

  • Selectați un element la întâmplare.: random.choice()
  • Selectarea aleatorie a mai multor elemente (fără duplicate): random.sample()
  • Selectarea aleatorie a mai multor elemente (cu duplicate): random.choices()
  • Fixați sămânța de numere aleatoare

Selectați un element la întâmplare.: random.choice()

Cu ajutorul funcției choose() a modulului random, un element este selectat aleatoriu din listă și poate fi recuperat.

import random

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

print(random.choice(l))
# 1

Același lucru este valabil și pentru tupluri și șiruri de caractere. În cazul șirurilor de caractere, se selectează un singur caracter.

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

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

Eroare în cazul în care se specifică o listă, un tuplu sau un șir de caractere gol ca argument.

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

Selectarea aleatorie a mai multor elemente (fără duplicate): random.sample()

Cu ajutorul funcției sample() din modulul random, puteți obține mai multe elemente la întâmplare dintr-o listă. Nu există duplicare de elemente (extragere nerecuperabilă).

Primul argument este o listă, iar al doilea argument este numărul de elemente care trebuie recuperate. Lista este returnată.

import random

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

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

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

Dacă al doilea argument este setat la 1, se returnează o listă cu un element; dacă este setat la 0, lista este goală. Dacă al doilea argument este 1, se returnează o listă cu un element; dacă este 0, se returnează o listă goală; dacă primul argument este mai mare decât numărul de elemente din listă, se produce o eroare.

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

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

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

Dacă primul argument este un tupluplu sau un șir de caractere, ceea ce se returnează este tot o listă.

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

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

Dacă doriți să reveniți la un tuple sau la un șir de caractere, utilizați tuple(),join().

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

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

Rețineți că valoarea nu este evaluată, astfel încât, dacă lista sau tupla originală conține elemente cu aceeași valoare, există posibilitatea ca aceeași valoare să fie selectată.

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

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

Dacă doriți să evitați valorile duplicate, puteți utiliza set() pentru a o converti într-un set (tip set) și a extrage numai elementele unice, apoi utilizați sample().

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

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

Selectarea aleatorie a mai multor elemente (cu duplicate): random.choices()

Funcția choices() a modulului random vă permite să preluați mai multe elemente la întâmplare dintr-o listă și, spre deosebire de sample(), permite selectarea elementelor duplicate.

choices() este o funcție adăugată în Python 3.6. Ea nu este disponibilă în versiunile anterioare.

Argumentul k specifică numărul de elemente care trebuie recuperate. Este permisă duplicarea, astfel încât numărul de elemente care urmează să fie recuperate poate fi mai mare decât numărul de elemente din lista originală.

Deoarece k este un argument de tip „keyword-only”, este necesar să se specifice un cuvânt cheie, cum ar fi 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]

Valoarea implicită a lui k este 1; dacă este omisă, se returnează o listă cu 1 element.

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

Argumentul weights poate fi utilizat pentru a specifica ponderea (probabilitatea) ca fiecare element să fie selectat, iar tipul elementelor din listă poate fi int sau 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]

Argumentul cum_weights poate fi, de asemenea, specificat ca o pondere cumulativă. Cum_weights din următorul exemplu de cod este echivalent cu primele ponderi de mai sus.

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

Valoarea implicită pentru ambele argumente weights și cum_weights este None, ceea ce înseamnă că fiecare element este selectat cu aceeași probabilitate.

Dacă lungimea (numărul de elemente) a argumentului „weights” sau „cum_weights” este diferită de cea a listei originale, apare o eroare.

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

De asemenea, este o greșeală să se precizeze ponderile și cum_weights în același timp.

# 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

În exemplul de cod de până acum am specificat o listă ca prim argument, dar același lucru este valabil și pentru tupluri și șiruri de caractere.

Fixați sămânța de numere aleatoare

Prin atribuirea unui număr întreg arbitrar funcției seed() a modulului random, se poate fixa sămânța de numere aleatoare și se poate inițializa generatorul de numere aleatoare.

După inițializarea cu aceeași sămânță, elementele sunt întotdeauna selectate în același mod.

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

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