如何从列表中随机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很有帮助。