Elecció, mostra i opcions per seleccionar elements aleatòriament d’una llista a Python.

Negocis

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
Copied title and URL