为什么我的代码不能解码基于字典的加密字符串?
问题描述:
我有一个代表字母的键和值的字典。为什么我的代码不能解码基于字典的加密字符串?
例如简单:
DICT_CODE = {'b' : 'g', 'n' :'a', 'p' : 'o', 'x' : 'd', 't' : 'y'}
我接收到的加密的代码并把该字符串到一个列表,其中每个项目是一个字。根据字典中的条目,我需要解决它。
的代码的例子是:
words_list = ["bppx","xnt!"] # "good day!"
我试着用双for循环来解决这个问题,如下:
for word in words_list:
for char in word:
if char in string.letters:
word = word.replace(char, DICT_CODE.get(char))
print words_list
预期输出 - >["good","day!"]
输出 - >["bppx","xnt!"]
它不工作在一个二。 charcaters保持不变,代码仍然未知。 我不明白为什么它不工作,如果有人有时间看,并尝试帮助我,看看有什么不对,甚至建议更好的方法(工程)。
答
你的问题是你实际上并没有修改原始列表。
for i, word in enumerate(words_list):
for char in word:
if char in string.letters:
word = word.replace(char, DICT_CODE.get(char))
words_list[i] = word
print words_list
['good', 'day!']
答
正如在评论中提到的,@marmeladze,print word_list will
打印您上述声明的word_list
。
你想要什么,是这样的:
DICT_CODE = {'b' : 'g', 'n' :'a', 'p' : 'o', 'x' : 'd', 't' : 'y', '!': '!'}
words_list = ["bppx","xnt!"]
decoded_list = []
for word in words_list:
for char in word:
word = word.replace(char, DICT_CODE.get(char))
decoded_list.append(word)
print decoded_list
输出
['good', 'day!']
希望这有助于。
答
更改for循环中的word
变量不会更改word_list
中的字符串。你需要记住的索引并更新索引处的元素(以及从索引字) -
for i, word in enumerate(words_list):
for char in word:
if char in string.letters:
words_list[i] = words_list[i].replace(char, DICT_CODE.get(char))
演示 -
>>> words_list = ["bppx","xnt!"]
>>> DICT_CODE = {'b' : 'g', 'n' :'a', 'p' : 'o', 'x' : 'd', 't' : 'y'}
>>> for i, word in enumerate(words_list):
... for char in word:
... if char in string.letters:
... words_list[i] = words_list[i].replace(char, DICT_CODE.get(char))
>>> words_list
['good', 'day!']
但你一个更简单的方法是要使用str.translate
(以及string.maketrans
)。示例 -
table = string.maketrans('bnpxt','gaody') #First argument characters in your original string, and second argument what they map to.
for i, word in enumerate(words_list):
words_list[i] = word.translate(table)
演示 -
>>> import string
>>> table = string.maketrans('bnpxt','gaody') #This creates the translation table
>>> words_list = ["bppx","xnt!"]
>>> for i, word in enumerate(words_list):
... words_list[i] = word.translate(table)
...
>>> print words_list
['good', 'day!']
此使用列表解析 -
words_list[:] = [word.translate(table) for word in words_list]
演示 -
>>> words_list = ["bppx","xnt!"]
>>> table = string.maketrans('bnpxt','gaody')
>>> words_list[:] = [word.translate(table) for word in words_list]
>>> words_list
['good', 'day!']
'打印word_list'将打印'word_list'你上面声明。 – marmeladze
'[''.join(DICT_CODE.get(c,c)for c in s)for s in word_list]' –