我如何从列表中随机选择(选取)一个项目(获取一个随机元素)?

2024-11-22 08:47:00
admin
原创
183
摘要:问题描述:如何从以下列表中随机检索一个项目?foo = ['a', 'b', 'c', 'd', 'e'] 解决方案 1:使用random.choice():import random foo = ['a', 'b', 'c', 'd', 'e'] print(random.choice(foo)) 对于加...

问题描述:

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

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

解决方案 1:

使用random.choice()

import random

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

对于加密安全的随机选择(例如,从单词列表生成密码),使用secrets.choice()

import secrets

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

secrets是 Python 3.6 中的新增功能。在旧版本的 Python 中,你可以使用以下random.SystemRandom类:

import random

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

解决方案 2:

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

import random
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 = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1] 

但是,如果你只从列表中提取一个项目,选择就不会那么笨重,因为使用 sample 会有语法random.sample(some_list, 1)[0]而不是random.choice(some_list)

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

编辑:使用秘密

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

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 单行

如果您想要一个更具 Python 风格的单行代码来选择多个项目,那么可以使用解包。

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

解决方案 3:

如果您还需要索引,请使用random.randrange

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

解决方案 4:

从 Python 3.6 开始,您可以使用secrets模块,它比用于random加密或安全用途的模块更可取。

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

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

要打印随机索引:

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

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

解决方案 5:

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

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

解决方案 6:

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)

解决方案 7:

NumPy解决方案:numpy.random.choice

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

而且这两种方法之间还存在一些差异,可能与您的实际使用情况有关。

import numpy as np
np.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

解决方案 8:

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

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

解决方案 9:

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

假设我有以下列表:

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

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

如果你想要接近真正的随机,那么我建议secrets.choice从标准库(Python 3.6 中的新功能)开始:

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

以上内容相当于我以前的建议,使用模块SystemRandom中的对象randomchoice方法 - 在 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)

嗯,是的,您可以传递一个“种子”参数,但您会发现对象SystemRandom只是忽略它:

def seed(self, *args, **kwds):
    "Stub method.  Not used for a system random number generator."
    return None

解决方案 10:

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

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

random.choice 的作用是一样的:)

解决方案 11:

总之,使用random.sample方法

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

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

Output:['d', 'e', 'a']

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

解决方案 12:

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

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)

解决方案 13:

随机物品选择:

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的重复

解决方案 14:

你可以:

from random import randint

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

print(foo[randint(0,4)])

解决方案 15:

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

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

解决方案 16:

现在推荐的numpy方法是使用明确的 RNG:

from numpy.random import default_rng

rng = default_rng()
rng.choice(foo)

解决方案 17:

要从列表中选择多个值foo = ['a', 'b', 'c', 'd', 'e'],请参阅下表了解每个模块中的相关方法。

替换无需更换
random 随机选择(foo,k=4) 随机.采样(foo,k=4)
numpy rng = np.random.default_rng() rng.choice(foo,size=4) rng = np.random.default_rng() rng.choice(foo,size=4,replace=False)
pandas s = pd.Series(foo)s.sample(n=4,replace=True) s = pd.Series(foo)s.sample(n=4)

在性能方面,它取决于原始数据的大小和采样数据的大小,但一般来说,random如果数据类型是 Python 数据结构(例如列表),则最好使用,而numpy/pandas在其本机对象上表现最佳,例如 numpy ndarray、pandas Series。

例如,在以下基准测试中(在 Python 3.11.4、numpy 1.25.2 和 pandas 2.0.3 上测试),从长度为 100k 的对象中抽取 20k 个项目,numpy 和 pandas 在数组和系列上的运行速度非常快,但在列表上的运行速度很慢,而 则random.choices是列表上最快的。

import timeit

setup = """
import random
import pandas as pd
import numpy as np

li = list(range(100000))
ar = np.array(li)
sr = pd.Series(li)
n = len(li)//5
"""

min(timeit.repeat("random.choices(li, k=n)", setup, number=100))                     # 0.5333051000052365 
min(timeit.repeat("np.random.default_rng().choice(li, size=n)", setup, number=100))  # 0.9663617000041995 
min(timeit.repeat("pd.Series(li).sample(n=n, replace=True)", setup, number=100))     # 3.30128049999621 

min(timeit.repeat("random.choices(ar, k=n)", setup, number=100))                     # 0.5489860999950906 
min(timeit.repeat("np.random.default_rng().choice(ar, size=n)", setup, number=100))  # 0.030448100005742162 
min(timeit.repeat("pd.Series(ar).sample(n=n, replace=True)", setup, number=100))     # 0.07655550000345102 

min(timeit.repeat("random.choices(sr, k=n)", setup, number=100))                     # 6.577740900000208 
min(timeit.repeat("np.random.default_rng().choice(sr, size=n)", setup, number=100))  # 0.0323493999967468 
min(timeit.repeat("sr.sample(n=n, replace=True)", setup, number=100))                # 0.06925690000207396

解决方案 18:

我们也可以使用 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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用