Skip to content

Campionamento casuale da un elenco in Python (random.choice, sample, choices)

Python

In Python, puoi campionare casualmente gli elementi da un elenco con choice(), sample() e choice() del modulo random. Queste funzioni possono essere applicate anche a una stringa e una tupla.

choice() restituisce un elemento casuale e sample() e choice() restituiscono un elenco di più elementi casuali. sample() viene utilizzato per il campionamento casuale viene utilizzato, e choice() viene utilizzato per il campionamento casuale con l’utilizzo.

In questo articolo vengono descritti i seguenti contenuti.

  • Scegli un elemento casuale:random.choice()
  • Campione casuale senza sostituzioni:random.sample()
  • Campione casuale con sostituzione:random.choices()
  • Inizializza il generatore di numeri casuali:random.seed()

Se si desidera selezionare elementi da un elenco in base alle condizioni, vedere il seguente articolo.

Se vuoi mescolare l’intero elenco o ottenere un elenco di numeri casuali, consulta il seguente articolo.

Scegli un elemento casuale:random.choice()

random.choice() fornisce un elemento casuale da un elenco.

import random

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

print(random.choice(l))
# 1

Tuple e stringhe vengono elaborate in modo similitudine. Nel caso di una stringa, viene restituito un carattere.

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

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

Viene generato un errore se una lista, una tupla o una stringa è vuota.

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

Campione casuale senza sostituzioni:random.sample()

random.sample() casualmente più elementi da un elenco senza.

Passa una lista al primo argomento e il numero di elementi che vuoi ottenere al secondo argomento. Viene restituito un elenco.

import random

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

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

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

Se il secondo argomento è impostato su 1, viene restituito un elenco con un elemento. Se impostato su 0, viene restituito un elenco vuoto. Se impostato sul valore che supera il numero di elementi dell’elenco, viene generato un errore.

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

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

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

Anche se si passa una tupla o una stringa al primo argomento, viene restituito l’elenco.

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

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

Per scegliere una lista in una tupla o una stringa, usa tuple(), join().

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

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

Si noti che se l’elenco o la tupla originale contiene elementi duplicati, è possibile che venga selezionato lo stesso valore.

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

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

Se vuoi evitare valori ti, usa set() per utilizzare liste e tuple da impostare, estrai solo elementi univoci, quindi usa sample().

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

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

Campione casuale con sostituzione:random.choices()

random.choices() campionario casualmente più elementi da un elenco con la guida.

random.choices() è stato aggiunto in Python 3.6 e non può essere utilizzato nelle versioni precedenti.

Specifica il numero di elementi che vuoi ottenere con l’argomento k. Poiché gli elementi vengono scelti con la sostituzione, k può essere maggiore del numero di elementi nell’elenco originale.

Poiché k è un argomento di sole parole chiave, è necessario specificare come 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]

k è impostato su 1 per configurazione predefinita. Se omesso, viene restituito un elenco con un elemento.

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

È possibile specificare il peso (probabilità) per ciascun elemento nell’argomento pesi. Il tipo dell’elemento dell’elenco specificato in weights può essere int o float. Se impostato a 0, l’elemento non è selezionato.

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]

I pesi cumulativi possono essere specificati nell’argomento cum_weights. cum_weights nel codice di esempio seguente è equivalente ai primi pesi nel codice precedente.

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

Per impostazione predefinita, sia pesi che cum_weights sono impostati su Nessuno e ogni elemento viene selezionato con la stessa probabilità.

Se la lunghezza (numero di elementi) di weights o cum_weights è diversa dall’elenco originale, viene generato un errore.

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

Inoltre, viene generato un errore se si specificano weights e cum_weights contemporaneamente.

# 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

Finora nel codice di esempio è stato specificato un elenco per il primo argomento, ma lo stesso vale per una tupla e una stringa.

Inizializza il generatore di numeri casuali:random.seed()

Puoi inizializzare un generatore di numeri casuali con random.seed().

Dopo l’inizializzazione con lo stesso seme, l’elemento viene selezionato allo stesso modo.

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

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