python title - Come selezionare casualmente un elemento da un elenco?




matplotlib figure (13)

Supponiamo di avere il seguente elenco:

foo = ['a', 'b', 'c', 'd', 'e']

Qual è il modo più semplice per recuperare un elemento a caso da questo elenco?


Answers

Come selezionare casualmente un elemento da un elenco?

Supponiamo di avere il seguente elenco:

>>> import random
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']

Qual è il modo più semplice per recuperare un elemento a caso da questo elenco?

Se vuoi essere veramente casuale , ti suggerisco di usare un oggetto SystemRandom dal modulo random con il metodo choice :

>>> sr.choice(foo)
'd'
>>> sr.choice(foo)
'e'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'b'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'c'
>>> sr.choice(foo)
'c'

E adesso:

>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>

Se si desidera una selezione pseudocasuale deterministica, utilizzare la funzione choice (che in realtà è un metodo associato su un oggetto Random ):

>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')

Sembra casuale, ma in realtà non lo è, che possiamo vedere se lo abbiamo ripetutamente ripetuto:

import numpy as np    
np.random.choice(foo) # randomly selects a single item

 import random_necessary pick = ['Miss','Mrs','MiSs','Miss'] print pick [int(random_necessary.random_necessary() * len(pick))] 

Spero che tu trovi questa soluzione utile.


Usa random.choice :

import random

foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

Per le scelte casuali crittograficamente sicure (ad esempio per generare una passphrase da un elenco di parole), utilizzare la classe random.SystemRandom :

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

Una soluzione semplice se stai cercando qualcosa di simile:

import random
pick = ['Random','Random1','Random2','Random3']
print  (pick[int(random.random() * len(pick))])

Il seguente codice dimostra se è necessario produrre gli stessi elementi. Puoi anche specificare quanti campioni vuoi estrarre.
Il metodo di sample restituisce una nuova lista contenente elementi dalla popolazione lasciando invariata la popolazione originale. L'elenco risultante è in ordine di selezione in modo che tutte le sottosezioni siano anche campioni casuali validi.

from random import *
library = ["New York", "Berlin", "Rome"]

for x in range (10):
    i = randrange(0,3)
    print(library[i])

Se hai bisogno anche dell'indice, usa random.randrange

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])

se hai bisogno dell'indice usa solo:

foo = ['a', 'b', 'c', 'd', 'e']  

random.choice fa lo stesso :)


A partire da Python 3.6 è possibile utilizzare il modulo dei secrets , che è preferibile al modulo random per la crittografia o gli usi di sicurezza.

Per stampare un elemento casuale da un elenco:

print(secrets.randbelow(len(foo)))

Per stampare un indice casuale:

s=set(range(1,6))
import random

while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Per dettagli, consultare PEP 506 .


random_items = random.sample(population=foo, k=number_of_samples)

In python 2:

random_items = random.choices(population=foo, k=number_of_samples)

In python 3:

import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]

Possiamo anche farlo usando randint.

import random as random
random.seed(0)  # don't use seed function, if you want different results in each run
print(random.sample(foo,3))  # 3 is the number of sample you want to retrieve

Output:['d', 'e', 'a']

soluzione numpy.random.choice : numpy.random.choice

Per questa domanda, funziona come la risposta accettata ( import random; random.choice() ), ma l'ho aggiunta perché il programmatore potrebbe aver già importato numpy (come me) e anche ci sono alcune differenze tra i due metodi che potrebbe riguardare il tuo caso d'uso effettivo.

np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'

Per la riproducibilità, puoi fare:

np.random.choice(foo, 5)          # sample with replacement (default)
np.random.choice(foo, 5, False)   # sample without replacement

Per i campioni di uno o più elementi , restituiti come array , passare l'argomento size :

from random import randint
l= ['a','b','c']

def get_rand_element(l):
    if l:
        return l[randint(0,len(l)-1)]
    else:
        return None

get_rand_element(l)

Se si desidera selezionare in modo casuale più di un elemento da un elenco o selezionare un elemento da un set, si consiglia di utilizzare invece random.sample .

import random
group_of_items = {1, 2, 3, 4}               # a sequence or set will work here.
num_to_select = 2                           # set the number to select here.
list_of_random_items = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1] 

Se stai tirando solo un singolo oggetto da una lista, la scelta è meno grossa, dato che l'uso di sample dovrebbe avere la sintassi random.sample(some_list, 1)[0] invece di random.choice(some_list) .

Sfortunatamente, però, la scelta funziona solo per un singolo output da sequenze (come liste o tuple). Sebbene random.choice(tuple(some_set)) possa essere un'opzione per ottenere un singolo oggetto da un set.

EDIT: Usando i segreti

Come molti hanno sottolineato, se hai bisogno di campioni pseudocasuali più sicuri, dovresti usare il modulo dei segreti:

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))

Dizionario fornito

e = {1:39, 4:34, 7:110, 2:87}

Ordinamento

sred = sorted(e.items(), key=lambda value: value[1])

Risultato

[(4, 34), (1, 39), (2, 87), (7, 110)]

È possibile utilizzare una funzione lambda per ordinare le voci per valore e memorizzarle elaborate all'interno di una variabile, in questo caso sred con e il dizionario originale.

Spero che sia d'aiuto!







python list random