我有一个包含大约50个元素的字符串,我需要对其进行随机排序并生成一个更长的字符串,我发现random.sample()
只能选择唯一的元素,这很好但不适合我的用途,是否有一种方法可以在Python中允许重复元素,或者我需要手动构建一个循环呢?
我有一个包含大约50个元素的字符串,我需要对其进行随机排序并生成一个更长的字符串,我发现random.sample()
只能选择唯一的元素,这很好但不适合我的用途,是否有一种方法可以在Python中允许重复元素,或者我需要手动构建一个循环呢?
numpy.random.choice
。它有一个参数来指定你想要的样本数量,还有一个参数来指定是否需要替换。以下类似这样的东西应该可以工作。import numpy as np
choices = np.random.choice([1, 2, 3], size=10, replace=True)
# array([2, 1, 2, 3, 3, 1, 2, 2, 3, 2])
如果您的输入是字符串,比如说my_string = 'abc'
,您可以使用以下代码:choices = np.random.choice([char for char in my_string], size=10, replace=True)
# array(['c', 'b', 'b', 'c', 'b', 'a', 'a', 'a', 'c', 'c'], dtype='<U1')
然后通过以下方式获取一个新的字符串:
new_string = ''.join(choices)
# 'cbbcbaaacc'
计时三个答案和评论中的random.choices
(跳过''.join
部分,因为我们都使用了它),从字符串'abc'
生成1000个样本,得到:
numpy.random.choice([char for char in 'abc'], size=1000, replace=True)
:
34.1 µs ± 213 ns每个循环(7个运行的平均值±标准偏差,每个循环10000次)
random.choices('abc', k=1000)
269 µs ± 4.27 µs每个循环(7个运行的平均值±标准偏差,每个循环1000次)
[random.choice('abc') for _ in range(1000)]
:
924 µs ± 10.4 µs每个循环(7个运行的平均值±标准偏差,每个循环1000次)
[random.sample('abc',1)[0] for _ in range(1000)]
:
4.32 ms ± 67.3 µs每个循环(7个运行的平均值±标准偏差,每个循环100次)
Numpy远远是最快的。如果你在那里放置''.join
部分,你实际上会看到numpy和random.choices
不分上下,在这个例子中都比下一个最快的快三倍。
random.choices
函数并使用k
参数指定长度了吗? - S. W. G.random.choices([char for char in 'abc'], k=1000)
的每个循环时间为 269 us +/- 6.43 us
。但是,Numpy仍然是最快的。 - Engineeroreplace
参数是什么意思? - S. W. G.replace
参数只是意味着它会重复采样,因此在采样时不会用尽列表。也就是说,元素可以重复。 - Engineeroimport random
dict = 'abcdef'
''.join([random.choice(dict) for x in range(50)])
不是说这是最有效的(你应该在这里使用choice)...但考虑一下:
import random
a = ['a','b','c']
' '.join([random.sample(a,1)[0] for _ in range(6)])
我找到了这个,我忘记提到我使用的是Python 3.6:
DICTIONARY_NUMBERS_HEX = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
block_text = "".join(random.choices(DICTIONARY_NUMBERS_HEX,k=50)
使用k=50
命名参数将生成重复元素。