Les funcions choice(), sample() i choices() del mòdul aleatori de la biblioteca estàndard de Python es poden utilitzar per seleccionar i recuperar elements aleatòriament d’una llista, tupla, cadena o un altre objecte de seqüència (mostreig aleatori).
choice() obté un sol element, sample() i choices() obtenen una llista de diversos elements. sample() és extracció no recuperable sense duplicats, choices() és extracció recuperable amb duplicats.
La informació següent es proporciona aquí.
- Seleccioneu un element a l’atzar.:
random.choice()
- Seleccioneu aleatòriament diversos elements (sense duplicats):
random.sample()
- Seleccioneu aleatòriament diversos elements (amb duplicats):
random.choices()
- Corregiu la llavor del nombre aleatori
Seleccioneu un element a l’atzar.:random.choice()
Amb la funció del mòdul aleatori selecte(), un element es selecciona aleatòriament de la llista i es pot recuperar.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
El mateix s’aplica a les tuples i les cordes. En el cas de les cadenes, se selecciona un sol caràcter.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Error si s’especifica una llista buida, tupla o cadena com a argument.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Seleccioneu aleatòriament diversos elements (sense duplicats):random.sample()
Amb la funció sample() del mòdul aleatori, podeu obtenir diversos elements a l’atzar d’una llista. No hi ha duplicació d’elements (extracció no recuperable).
El primer argument és una llista i el segon argument és el nombre d’elements que cal recuperar. Es torna la llista.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Si el segon argument s’estableix a 1, també es retorna una llista amb un element; si s’estableix a 0, la llista està buida. Si el segon argument és 1, es retorna una llista amb un element; si és 0, es retorna una llista buida; si el primer argument és superior al nombre d’elements de la llista, es produeix un error.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Si el primer argument és una tupla o una cadena, el que es retorna encara és una llista.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Si voleu tornar a una tupla o cadena, feu servir tuple(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Tingueu en compte que el valor no es jutja, de manera que si la llista o la tupla original conté elements amb el mateix valor, hi ha la possibilitat que es seleccioni el mateix valor.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Si voleu evitar valors duplicats, podeu utilitzar set() per convertir-lo en un conjunt (tipus de conjunt) i extreure només els elements únics, i després utilitzar sample().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Seleccioneu aleatòriament diversos elements (amb duplicats):random.choices()
La funció choices() del mòdul aleatori us permet recuperar diversos elements a l’atzar d’una llista i, a diferència de sample(), permet seleccionar elements duplicats.
choices() és una funció afegida a Python 3.6. No està disponible en versions anteriors.
L’argument k especifica el nombre d’elements que cal recuperar. Es permet la duplicació, de manera que el nombre d’elements a recuperar pot ser més gran que el nombre d’elements de la llista original.
Com que k és un argument només de paraula clau, cal especificar una paraula clau, com ara 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]
El valor per defecte de k és 1; si s’omet, es retorna una llista amb 1 element.
print(random.choices(l))
# [1]
L’argument pesos es pot utilitzar per especificar el pes (probabilitat) que es seleccionarà cada element, i el tipus d’elements de la llista pot ser int o 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]
L’argument cum_weights també es pot especificar com a pes acumulat. El cum_weights del codi d’exemple següent és equivalent als primers pesos anteriors.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
El valor predeterminat dels dos arguments weights i cum_weights és Cap, el que significa que cada element es selecciona amb la mateixa probabilitat.
Si la longitud (nombre d’elements) de l’argument pesos o cum_weights és diferent de la llista original, es produeix un error.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
També és un error especificar pesos i cum_weights al mateix temps.
# 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
Hem especificat una llista com a primer argument com a exemple al codi d’exemple fins ara, però el mateix s’aplica a les tuples i les cadenes.
Corregiu la llavor del nombre aleatori
En donar un nombre enter arbitrari a la funció seed() del mòdul aleatori, es pot arreglar la llavor de nombres aleatoris i es pot inicialitzar el generador de números aleatoris.
Després de la inicialització amb la mateixa llavor, els elements es seleccionen sempre de la mateixa manera.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3