我有一个字典形式的替代表。我需要遍历一个字符串,并根据示例所示的表替换每个字符。
如何用表中的随机分配替换"rrFrd?F??-rd?-drr"
(示例)?每个字符都是键,我需要用其列表r
= a
或e
或q
中的元组之一替换它,以此类推。我不知道如何使用给定的键访问字典列表,并从该列表中获取随机字母。
{'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)]}
答案 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