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

如何从以下列表中随机检索项目?

foo = ['a', 'b', 'c', 'd', 'e']
2015376 次浏览

使用#0

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

对于密码安全随机选择(例如,从单词列表生成密码),使用#0

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

secrets在Python 3.6中是新的。在旧版本的Python上,您可以使用#1类:

import random
secure_random = random.SystemRandom()print(secure_random.choice(foo))

如果您还需要索引,请使用#0

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

如果您需要索引,只需使用:

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

random.choice也一样:)

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

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

我们也可以使用randint。

from random import randintl= ['a','b','c']
def get_rand_element(l):if l:return l[randint(0,len(l)-1)]else:return None
get_rand_element(l)

这是带有定义随机索引的变量的代码:

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

这是没有变量的代码:

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)

如果您想从列表中随机选择多个项目,或者从集合中选择一个项目,我建议使用random.sample代替。

import randomgroup_of_items = {'a', 'b', 'c', 'd', 'e'}  # 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]

但是,如果您只从列表中提取单个项目,则选择不那么笨重,因为使用示例将具有语法random.sample(some_list, 1)[0]而不是random.choice(some_list)

不幸的是,选择仅适用于序列(例如列表或元组)的单个输出。虽然random.choice(tuple(some_set))可能是从集合中获取单个项目的选项。

编辑:使用秘密

正如许多人指出的那样,如果您需要更安全的伪随机样本,您应该使用秘密模块:

import secrets                              # imports secure module.secure_random = secrets.SystemRandom()      # creates a secure random object.group_of_items = {'a', 'b', 'c', 'd', 'e'}  # 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]

编辑:Pythonic One-Liner

如果你想要一个更Pythonic单行选择多个项目,你可以使用拆包。

import randomfirst_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)

从Python 3.6开始,您可以使用#0模块,它比#1模块更适合用于加密或安全用途。

要从列表中打印随机元素:

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

要打印随机索引:

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

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

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

假设我有以下列表:

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

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

如果你想要关闭真正随机,那么我建议从标准库(Python 3.6中新增)中选择secrets.choice

>>> from secrets import choice         # Python 3 only>>> choice(list('abcde'))'c'

上面相当于我以前的建议,使用random模块中的SystemRandom对象和choice方法——在Python 2的前面可用:

>>> import random                      # Python 2 compatible>>> 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'

如果您想要确定性伪随机选择,请使用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')

一条评论:

这与random.choice是否真正随机无关。如果您修复了种子,您将获得可重复的结果-这就是种子的设计目的。您也可以将种子传递给SystemRandom。sr = random.SystemRandom(42)

好吧,是的,你可以传递一个“种子”参数,但是你会看到#0对象简单地忽略它

def seed(self, *args, **kwds):"Stub method.  Not used for a system random number generator."return None
foo = ['a', 'b', 'c', 'd', 'e']number_of_samples = 1

在Python 2中:

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

在Python 3中:

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

NumPy解决方案:#0

对于这个问题,它的工作方式与接受的答案(import random; random.choice())相同,但我添加它是因为程序员可能已经导入了NumPy(像我一样)

还有两种方法之间的一些差异可能与您的实际用例有关。

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

对于可重复性,您可以这样做:

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

对于一个或多个项目的样本,作为array返回,传递size参数:

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

简而言之,使用random.sample方法

sample方法返回一个包含总体元素的新列表,同时保持原始总体不变。生成的列表按选择顺序排列,因此所有子片也将是有效的随机样本。

import randomlst = ['a', 'b', 'c', 'd', 'e']random.seed(0)  # remove this line, if you want different results for each runrand_lst = random.sample(lst,3)  # 3 is the number of sample you want to retrieveprint(rand_lst)
Output:['d', 'e', 'a']

这是一个运行代码https://onecompiler.com/python/3xem5jjvz

随机项目选择:

import random
my_list = [1, 2, 3, 4, 5]num_selections = 2
new_list = random.sample(my_list, num_selections)

为了保持列表的顺序,你可以这样做:

randIndex = random.sample(range(len(my_list)), n_selections)randIndex.sort()new_list = [my_list[i] for i in randIndex]

复制https://stackoverflow.com/a/49682832/4383027

你可以只:

from random import randint
foo = ["a", "b", "c", "d", "e"]
print(foo[randint(0,4)])

这可能已经是一个答案,但您可以使用random.shuffle。示例:

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

推荐#0方式现在使用显式RNG:

from numpy.random import default_rng
rng = default_rng()rng.choice(foo)

我通常使用随机模块来处理列表和随机化

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