如何从列表中随机select一个项目?

假设我有以下列表:

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

从这个列表中随机检索一个项目的最简单的方法是什么?

使用random.choice

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

对于密码安全的随机select(例如,用于从单词列表生成密码短语),请使用random.SystemRandom类:

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

如果你还需要索引:

 foo = ['a', 'b', 'c', 'd', 'e'] from random import randrange random_index = randrange(0,len(foo)) print foo[random_index] 

如果你想从列表中随机select多个项目,或从一个集合中select一个项目,我build议使用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] 

如果您只是从列表中拉出单个项目,则select不会random.sample(some_list, 1)[0]笨重,因为使用示例将具有random.sample(some_list, 1)[0]而不是random.choice(some_list)

不幸的是,select只适用于序列的单个输出(如列表或元组)。 尽piperandom.choice(tuple(some_set))可能是一个从一个集合中获取单个项目的选项。

我提出一个脚本,用于从列表中删除随机拾取的项目,直到它为空:

保持一个set并删除随机拾取的元素(有choice ),直到列表为空。

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

三次运行给出三个不同的答案:

 >>> 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([]) 

从Python 3.6开始,您可以使用secrets模块,这对于密码学或安全用途的random模块来说是更可取的。

从列表中打印一个随机元素:

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

要打印一个随机索引:

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

有关详细信息,请参阅PEP 506 。

这是具有定义随机索引的variables的代码:

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

这是没有variables的代码:

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

这是代码以最短,最聪明的方式做到这一点:

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

(python 2.7)

如果你需要的索引只是使用:

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

random.choice也是这样:)

我们也可以使用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) 

如何从列表中随机select一个项目?

假设我有以下列表:

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

从这个列表中随机检索一个项目的最简单的方法是什么?

如果你想接近真正的随机 ,那么我build议使用random模块中的SystemRandom对象和choice方法:

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

现在:

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

如果你想要一个确定性的伪随机select,使用choice函数(这实际上是一个Random对象的绑定方法):

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

这似乎是随机的,但实际上并非如此,我们可以看到,如果我们重复的种子:

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

我这样做是为了让它工作:

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

我希望你觉得这个解决scheme很有帮助。