生成字符串中的字符循环, Python中随机选择带有权重的方法

2024-10-03 17:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个循环,该循环将生成一个由已定义字符组成的随机字符串'X,T,B,G',该字符串的每个位置都有一组唯一的权重。

在循环中,所需的输出如下所示:

['TTGXB',
 'BXTBT',
 'XTBXT',
 'GTTGB',
 'XXBBB',
 'BGXXX',
 'XTXTT',
 'XTTGB',
 'TGBBG',
 'TGXXB']

数据帧示例:

^{pr2}$

stats.to_numpy()要获取用于随机字符串生成的权重数组:

^{3}$

理想情况下,我可以自动输入上面的np.array中的权重。


Tags: 数据字符串定义字符权重xtbxttgbbgttgxb
3条回答
from random import choices

def random_string(chars, weights, length):
    string = []
    for _ in range(length):
        string += choices(chars, weights=weights)
    return ''.join(string)

chars = list('XTBG')
weights = [0.1, 0.4, 0.2, 0.3]

print(random_string(chars, weights, 4))
# GBTT

编辑:说明使用不同的重量。。。在

^{pr2}$

一个大字符的存储更有效:

# 872 using sys.getsizeof()
chars = ['X'] * 28 + ['T'] * 21 + ['B'] * 23 + ['G'] * 28

# 104 using sys.getsizeof()
weights = [28, 28, 28, 28]

# 80 using sys.getsizeof()
weights = [(28, 28, 28, 28)]

您可以用这个函数做类似的事情,同时迭代不同的权重、不同的长度和不同的字符。包含权重的元组列表比字符列表使用的内存少十倍。在

x = [pos_1, pos_2, pos_3, pos_4]
[''.join([random.choice(i) for i in x]) for _ in range(10)]

输出样品

^{pr2}$

您可以通过

x = [['X'] * 28 + ['T'] * 21 + ['B'] * 23 + ['G'] * 28, ['X'] * 29 + ['T'] * 22 + ['B'] * 23 + ['G'] * 26, ['X'] * 29 + ['T'] * 22 + ['B'] * 23 + ['G'] * 26, ['X'] * 29 + ['T'] * 22 + ['B'] * 23 + ['G'] * 26]

[''.join([random.choice(i) for i in x]) for _ in range(10)]

要使过程自动化,请尝试

weight = [[28,21,23,28], [29,22,23,26],[29,22,23,26],[29,22,23,26]]
alp = [['X'], ['T'], ['B'], ['G']]
x = [sum([w[i]*alp[i] for i in range(len(alp))], []) for w in weight]
print([''.join([random.choice(i) for i in x]) for _ in range(10)])
array = []
for _ in range(100):
    array.append(random.choice(pos_1) + random.choice(pos_2)
        + random.choice(pos_3) + random.choice(pos_4))

相关问题 更多 >