IT-Swarm.Net

Kako nasumično odabrati stavku s popisa?

Pretpostavimo da imam sljedeći popis:

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

Koji je najjednostavniji način dohvaćanja predmeta nasumično s ovog popisa?

1567
Ray Vega

Upotrijebite random.choice()

import random

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

Za kriptografski sigurne slučajne izbore (npr. Za generiranje lozinke s popisa riječi) koristite random.SystemRandom klasa

import random

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

ili secrets.choice()

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
2473
Pēteris Caune

Ako želite nasumično odabrati više stavki s popisa ili odabrati stavku iz skupa, preporučam da upotrijebite 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] 

Ako s popisa povlačite samo jednu stavku, izbor je manje nespretan, jer bi pomoću uzorka imala sintaksa random.sample(some_list, 1)[0] umjesto random.choice(some_list).

Međutim, nažalost, izbor djeluje samo na jedan izlaz iz nizova (poput popisa ili zbirki). Iako random.choice(Tuple(some_set)) može biti opcija za dobivanje jedne stavke iz skupa.

REĐAJ: Upotreba tajni

Kao što su mnogi istaknuli, ako vam trebaju sigurniji pseudo slučajni uzorci, trebali biste koristiti modul tajne:

import secrets                              # imports secure module.
secure_random = secrets.SystemRandom()      # creates a secure random object.
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 = secure_random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
159
Paul

Ako vam treba i indeks, koristite random.randrange

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

Od Python-a 3.6 možete koristiti modul secretsNAME _ , što je poželjnije modulu randomNAME _ za kriptografiju ili sigurnosnu upotrebu.

Za ispis slučajnog elementa s popisa:

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

Za ispis slučajnog indeksa:

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

Za detalje pogledajte PEP 506 .

35
Chris_Rands

Predlažem skriptu za uklanjanje nasumično pokupljenih predmeta s popisa dok se ne isprazni:

Održavajte set i uklonite nasumično pokupljeni element (s choice) dok popis ne bude prazan.

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

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

Tri izvođenja daju tri različita odgovora:

>>> 
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>> 
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])

>>> 
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
31
kiriloff
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

U pythonu 2:

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

U pythonu 3:

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

Kako nasumično odabrati stavku s popisa?

Pretpostavimo da imam sljedeći popis:

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

Koji je najjednostavniji način dohvaćanja predmeta nasumično s ovog popisa?

Ako želite blizu doista slučajno, onda predlažem korištenje SystemRandom objekta iz modula random pomoću metode choice:

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

A sada:

>>> 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'

Ako želite determinirani pseudo slučajni odabir, upotrijebite funkciju choice (koja je zapravo povezana metoda na objektu Random):

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

Čini se slučajnim, ali zapravo nije, što vidimo i ako smo ga ponovo operirali:

>>> 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')
9
Aaron Hall

ako vam je potreban indeks, samo upotrijebite:

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

random.choice čini isto :)

8
Janek Olszak

numpy rješenje: numpy.random.choice

Za ovo pitanje djeluje isto kao i prihvaćeni odgovor (import random; random.choice()), ali dodao sam ga zato što je programer možda već uveo numpy (poput mene) i također postoje neke razlike između dvije metode to može se odnositi na stvarni slučaj upotrebe.

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

Za obnovljivost možete učiniti:

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

Za uzorke jedne ili više stavki , vraćenih kao array, proslijedite argument size:

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

Ovo je kôd sa varijablom koja definira slučajni indeks:

import random

foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1) 
print (foo[randomindex])
## print (randomindex)

Ovo je kôd bez varijable:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])

A ovo je kôd na najkraći i najpametniji način da to učinite:

import random

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

(python 2.7)

7
Liam

To možemo učiniti i randintom.

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)
2
Abdul Majeed

Sljedeći kôd pokazuje ako trebate proizvesti iste stavke. Možete odrediti i koliko uzoraka želite izdvojiti.
Metoda sample vraća novi popis koji sadrži elemente iz populacije, a izvornu populaciju ostavlja nepromijenjenom. Rezultirajući popis nalazi se u redoslijedu odabira tako da će svi podrezanci također biti valjani slučajni uzorci.

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']
2
Memin

Jedno jednostavno rješenje ako tražite nešto takvo:

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

for x in range (10):
    i = randrange(0,3)
    print(library[i])
2
lorde
import random
list=range(100)
random_value=random.choice(list)
print(random_value)
0
Ravi G