Elección, mostra e opcións para seleccionar elementos aleatoriamente dunha lista en Python.

Negocios

As funcións choice(), sample() e choices() do módulo aleatorio da biblioteca estándar de Python pódense usar para seleccionar e recuperar elementos aleatoriamente dunha lista, tupla, cadea ou outro obxecto de secuencia (mostraxe aleatoria).

choice() obtén un único elemento, sample() e choices() obtén unha lista de varios elementos. sample() é extracción non recuperable sen duplicados, choices() é extracción recuperable con duplicados.

A seguinte información ofrécese aquí.

  • Selecciona un elemento ao azar.:random.choice()
  • Selecciona aleatoriamente varios elementos (sen duplicados):random.sample()
  • Selecciona aleatoriamente varios elementos (con duplicados):random.choices()
  • Corrixe a semente do número aleatorio

Selecciona un elemento ao azar.:random.choice()

Coa función choose() do módulo aleatorio, selecciónase aleatoriamente un elemento da lista e pódese recuperar.

import random

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

print(random.choice(l))
# 1

O mesmo aplícase ás tuplas e ás cordas. No caso das cadeas, selecciónase un só carácter.

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

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

Produciuse un erro se se especifica unha lista, tupla ou cadea baleiras como argumento.

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

Selecciona aleatoriamente varios elementos (sen duplicados):random.sample()

Coa función sample() do módulo aleatorio, pode obter varios elementos ao azar dunha lista. Non hai duplicación de elementos (extracción non recuperable).

O primeiro argumento é unha lista e o segundo é o número de elementos que se van recuperar. Devólvese a lista.

import random

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

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

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

Se o segundo argumento se establece en 1, tamén se devolve unha lista cun elemento; se se establece en 0, a lista está baleira. Se o segundo argumento é 1, devólvese unha lista cun elemento; se é 0, devólvese unha lista baleira; se o primeiro argumento é máis que o número de elementos da lista, prodúcese un erro.

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

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

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

Se o primeiro argumento é unha tupla ou unha cadea, o que se devolve aínda é unha lista.

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

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

Se queres volver a unha tupla ou cadea, usa tupla(),join().

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

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

Teña en conta que o valor non se xulga, polo que se a lista ou tupla orixinal contén elementos co mesmo valor, existe a posibilidade de que se seleccione o mesmo valor.

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

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

Se queres evitar valores duplicados, podes usar set() para convertelo nun conxunto (tipo de conxunto) e extraer só os elementos únicos, e despois usar sample().

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

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

Selecciona aleatoriamente varios elementos (con duplicados):random.choices()

A función choices() do módulo aleatorio permítelle recuperar varios elementos ao azar dunha lista e, a diferenza de sample(), permite seleccionar elementos duplicados.

choices() é unha función engadida en Python 3.6. Non está dispoñible en versións anteriores.

O argumento k especifica o número de elementos que se van recuperar. Permítese a duplicación, polo que o número de elementos a recuperar pode ser maior que o número de elementos da lista orixinal.

Dado que k é un argumento só de palabra clave, é necesario especificar unha palabra clave, como 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]

O valor predeterminado de k é 1; se se omite, devólvese unha lista con 1 elemento.

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

Os pesos dos argumentos pódense usar para especificar o peso (probabilidade) de que se seleccione cada elemento e o tipo de elementos da lista pode ser int ou 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]

O argumento cum_weights tamén se pode especificar como un peso acumulativo. Os cum_weights do seguinte código de exemplo son equivalentes aos primeiros pesos anteriores.

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

O valor predeterminado para os argumentos weights e cum_weights é None, o que significa que cada elemento se selecciona coa mesma probabilidade.

Se a lonxitude (número de elementos) dos argumentos pesos ou cum_weights é diferente da lista orixinal, prodúcese un erro.

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

Tamén é un erro especificar pesos e cum_weights ao mesmo tempo.

# 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

Especificamos unha lista como primeiro argumento como exemplo no código de mostra ata agora, pero o mesmo aplícase ás tuplas e cadeas.

Corrixe a semente do número aleatorio

Ao dar un número enteiro arbitrario á función seed() do módulo aleatorio, pódese corrixir a semente de números aleatorios e inicializar o xerador de números aleatorios.

Despois da inicialización coa mesma semente, os elementos sempre se seleccionan do mesmo xeito.

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

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