从字典中的列表中获取随机值

时间:2019-03-20 17:32:35

标签: python

我有一个字典形式的替代表。我需要遍历一个字符串,并根据示例所示的表替换每个字符。

如何用表中的随机分配替换"rrFrd?F??-rd?-drr"(示例)?每个字符都是键,我需要用其列表r = aeq中的元组之一替换它,以此类推。我不知道如何使用给定的键访问字典列表,并从该列表中获取随机字母。

 {'r': [('a', 0.7), ('e', 0.3), ('q', 0.1)], 'F': [('b', 0.6), (',', 0.3),    ('m', 0.1)], 'd': [('r', 0.5), ('.', 0.2), ('?', 0.2), ('(', 0.1)], '-': [('p', 0.4), ('f', 0.2), ('n', 0.1), ('@', 0.1)]}

2 个答案:

答案 0 :(得分:1)

首先,您的字典缺少键'?',并且并非所有概率加起来。这是您的示例正确的格言:

d = {'r': [('a', 0.7), ('e', 0.2), ('q', 0.1)], 
     'F': [('b', 0.6), (',', 0.3), ('m', 0.1)],
     'd': [('r', 0.5), ('.', 0.2), ('?', 0.2), ('(', 0.1)], 
     '-': [('p', 0.4), ('f', 0.2), ('n', 0.1), ('@', 0.3)],
     '?': [(' ', 1)]}

要根据概率选择随机字符,可以使用numpy.random.choice。这是最少的代码:

import numpy as np

d = {'r': [('a', 0.7), ('e', 0.2), ('q', 0.1)], 
     'F': [('b', 0.6), (',', 0.3), ('m', 0.1)],
     'd': [('r', 0.5), ('.', 0.2), ('?', 0.2), ('(', 0.1)], 
     '-': [('p', 0.4), ('f', 0.2), ('n', 0.1), ('@', 0.3)],
     '?': [(' ', 1)]}

s = "rrFrd?F??-rd?-drr"
new_s = ""

for char in s:
    new_chars_list = [i[0] for i in d[char]]
    proba_chars = [i[1] for i in d[char]]
    new_char = np.random.choice(a=new_chars_list, size=1, p=proba_chars)
    new_s += new_char[0]

print new_s

答案 1 :(得分:0)

假设我正确理解了您的要求,从相关索引索引的字典列表中选择一个选项的最简单方法是使用random.choice(yourdict[character])[0]-这将返回一个随机字母该键列表中的元组。

例如:

import random

x = "rrFrd?F??-rd?-drr"
y = {'r': [('a', 0.7), ('e', 0.3), ('q', 0.1)], 'F': [('b', 0.6), (',', 0.3),    ('m', 0.1)], 'd': [('r', 0.5), ('.', 0.2), ('?', 0.2), ('(', 0.1)], '-': [('p', 0.4), ('f', 0.2), ('n', 0.1), ('@', 0.1)]}
z = ""

for character in x:
    if y.get(character) != None:
        z += random.choice(y[character])[0]
    else:
        z += character

print(z)

这将创建一个新的字符串z,每个在字典中具有键的字符都将替换为元组条目之一,而不在字典中的字符将被简单地传递。例如

[0] aqber?,??pq??p(ee

[1] qebq.?b??@qr?n.ae