Kaip atsitiktinai pasirinkti elementą iš sąrašo?

Tarkime, turiu šį sąrašą:

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

Kas yra paprasčiausias būdas gauti atsitiktinį elementą iš šio sąrašo?

1197
20 нояб. nustatė Ray Vega 20 nov. 2008-11-20 21:42 '08 at 9:42 pm 2008-11-20 21:42
@ 12 atsakymų

Naudokite random.choice :

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

Kriptografiškai saugiems atsitiktiniams variantams (pavyzdžiui, norint generuoti slaptafrazę iš žodžių sąrašo) naudokite random.SystemRandom klasę:

 import random foo = ['battery', 'correct', 'horse', 'staple'] secure_random = random.SystemRandom() print(secure_random.choice(foo)) 
1972 m
20 нояб. atsakymą pateikė Pēteris Caune 20 nov. 2008-11-20 21:46 '08 at 9:46 pm 2008-11-20 21:46

Jei taip pat reikia indekso:

border=0
 foo = ['a', 'b', 'c', 'd', 'e'] from random import randrange random_index = randrange(0,len(foo)) print foo[random_index] 
109
11 сент. atsakymas, kurį pateikė Juampi rugsėjo 11 d 2012-09-11 18:31 '12 12:31 pm 2012-09-11 18:31

Jei norite atsitiktine tvarka pasirinkti daugiau nei vieną elementą iš sąrašo arba pasirinkti elementą iš rinkinio, rekomenduoju naudoti 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] 

Jei iš sąrašo ištraukiate tik vieną elementą, pasirinkimas yra ne toks nepatogus, nes naudojant modelį bus random.sample(some_list, 1)[0] vietoj random.choice(some_list) .

Deja, pasirinkimas veikia tik vieną iš sekų (pvz., Sąrašų ar rinkmenų) išvestį. Nors random.choice(tuple(some_set)) gali būti vienas elementas iš rinkinio.

87
27 мая '15 в 20:07 2015-05-27 20:07 atsakymą pateikė Paulius gegužės 27 d. 15 d. 20:07 2015-05-27 20:07

Siūlau scenarijų, kuris pašalintų atsitiktinai pasirinktus elementus iš sąrašo, kol jis bus tuščias:

Palaikykite set ir ištrinkite atsitiktinai pasirinktą elementą ( choice ), kol sąrašas bus tuščias.

 s=set(range(1,6)) import random while len(s)>0: s.remove(random.choice(list(s))) print(s) 

Trys trasos pateikia tris skirtingus atsakymus:

 >>> 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([]) 
23
13 мая '13 в 5:47 2013-05-13 05:47 atsakymas pateikiamas gegužės 13 d., 13 d., 5:47, 2013-05-13 05:47

Naudodami „Python 3.6“, galite naudoti secrets modulį, kuris yra geriau nei random skirtas naudoti kriptografijoje ar saugoje.

Jei norite spausdinti atsitiktinį elementą iš sąrašo:

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

Jei norite spausdinti atsitiktinį indeksą:

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

Daugiau informacijos rasite PEP 506 .

20
05 дек. atsakymas, kurį pateikė Chris_Rands 05 Dec 2016-12-05 19:52 '16 at 19:52 2016-12-05 19:52

Tai kintamasis kodas, kuris apibrėžia atsitiktinį indeksą:

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

Tai kodas be kintamojo:

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

Ir tai yra trumpiausias ir protingiausias būdas:

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

(2.7 pythonas)

6
25 мая '15 в 17:57 2015-05-25 17:57 atsakymą pateikė Veltro gegužės 25 d., 15 val. 17:57 2015-05-25 17:57

jei jums reikia tik indekso:

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

random.choice daro tą patį :)

5
24 дек. Atsakymą pateikė Janek Olszak 24 d. 2012-12-24 01:06 '12 at 1:06 2012-12-24 01:06
 foo = ['a', 'b', 'c', 'd', 'e'] number_of_samples = 1 

„Python 2“:

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

3 pythone:

 random_items = random.choices(population=foo, k=number_of_samples) 
3
29 нояб. Atsakymą pateikė Fardin lapkričio 29 d. 2017-11-29 19:40 '17, 7:40 pm 2017-11-29 19:40

Taip pat galime tai padaryti su randint.

 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) 
3
05 авг. Atsakymas, kurį pateikė Abdul Majeed 05 rug. 2014-08-05 10:28 '14, 10:28 2014-08-05 10:28

Kaip atsitiktinai pasirinkti elementą iš sąrašo?

Tarkime, turiu šį sąrašą:

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

Kas yra paprasčiausias būdas gauti atsitiktinį elementą iš šio sąrašo?

Jei norite priartėti prie tikrai atsitiktinių , siūlome naudoti „ SystemRandom objektą iš random modulio choice metodu:

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

Ir dabar:

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

Jei norite nustatyti deterministinį pseudo atsitiktinį pasirinkimą, naudokite choice funkciją (kuri iš tikrųjų yra random objekto metodas):

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

Atrodo atsitiktinis, bet iš tikrųjų tai nėra taip, kad galėtume matyti, ar dar kartą ją pakartosime:

 >>> 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') 
2
24 июня '17 в 1:22 2017-06-24 01:22 atsakymą pateikė Aaron Hall birželio 17 d. 17 val. 1:22 2017-06-24 01:22

Aš tai padariau, kad jis veiktų:

 import random pick = ['Random','Random1','Random2','Random3'] print (pick[int(random.random() * len(pick))]) 
-5
02 февр. Atsakymą pateikė kapitonas BudderChunk 02 vasaris. 2014-02-02 23:00 '14 23:00 val. 2014-02-02 23:00
 import random_necessary pick = ['Miss','Mrs','MiSs','Miss'] print pick [int(random_necessary.random_necessary() * len(pick))] 

Tikiuosi, kad šis sprendimas bus naudingas.

-19
28 сент. atsakymą pateikė phani 28 sep . 2013-09-28 11:09 '13, 11:09, 2013-09-28 11:09

Kiti klausimai apie žymių arba Užduoti klausimą