Python字典与replace方法问题:加密文本解密结果错误
Tkinter文本加密解密功能修复
问题根源
- 解密函数未使用反向映射字典:预先定义的
sec字典是words的反向映射,但解密函数sec_to_word完全没有用到它,反而错误遍历原加密字典words,导致映射逻辑混乱。 - 替换顺序引发错误替换:原解密函数通过
replace全局替换字符,且遍历顺序是原加密字典的键,导致多次替换叠加。比如解密yhhy时,先把所有y替换成h(变成hhhh),随后又把所有h替换成n,最终得到nnnn。 - 冗余错误的嵌套循环:
for char in words[chars]完全无意义,因为words[chars]是单个字符,循环只会执行一次,徒增代码复杂度。
修复后的代码
from tkinter import Tk, Button, Label, Entry # 加密映射字典 words ={'q':'0','w':'1','e':'2','r':'3','t':'4','y':'5','u':'%','i':'7','o':'8', 'p':'9','a':'q','s':'w','d':'e','f':'r','g':'t','h':'y','j':'u','k':'i', 'z':'a','x':'s','c':'d','v':'f','b':'g','n':'h','m':'j','l':'o', '1':'z','2':'x','3':'c','4':'v','5':'b','6':'m','7':'.','8':'#','9':'@','0':'!', '@':'$','#':':','!':'&',':':'*','.':'n',' ':'6'} # 解密反向映射字典 sec ={'0':'q','1':'w','2':'e','3':'r','4':'t','5':'y','%':'u','7':'i','8':'o', '9':'p','q':'a','w':'s','e':'d','r':'f','t':'g','y':'h','u':'j', 'o':'l','a':'z','s':'x','d':'c','f':'v','g':'b','j':'m', 'z':'1','x':'2','c':'3','v':'4','b':'5','m':'6','.':'7','#':'8','@':'9','!':'0', '$':'@',':':'#','&':'!','*':':','6':' ','n':'.','h':'n','i':'k'} def word_to_sec(): input_text = word_to_sec_ent.get() # 逐个字符处理,避免全局replace导致的二次替换问题 output = [] for char in input_text: # 若字符不在字典中,保留原字符 output.append(words.get(char, char)) output_str = ''.join(output) config_lbl.config(text= f'word to sec: {output_str}') return output_str def sec_to_word(): input_text = sec_to_word_ent.get() # 使用反向字典sec,逐个字符处理 output = [] for char in input_text: # 若字符不在字典中,保留原字符 output.append(sec.get(char, char)) output_str = ''.join(output) config_lbl.config(text= f'sec to word: {output_str}') return output_str window = Tk() window.title('sec_maker made by: parsa') word_to_sec_lbl = Label(window,text= '输入文本转换为加密格式: ') word_to_sec_lbl.grid(row=1,column=1) word_to_sec_ent = Entry(window) word_to_sec_ent.grid(row=2,column=1) word_to_sec_btn = Button(window,text='转换为加密格式',command=word_to_sec) word_to_sec_btn.grid(row=3,column=1) sec_to_word_lbl = Label(window,text= '输入加密格式转换为文本:') sec_to_word_lbl.grid(row=1,column=3) sec_to_word_ent = Entry(window) sec_to_word_ent.grid(row=2,column=3) sec_to_word_btn = Button(window,text='转换为文本',command=sec_to_word) sec_to_word_btn.grid(row=3,column=3) config_lbl = Label(window,text='输出: ') config_lbl.grid(row=4,column=2) window.mainloop()
关键修改说明
- 加密函数优化:将全局
replace循环改为逐个字符遍历,通过words.get(char, char)获取加密字符,避免因替换后的字符与原字典键重复导致的二次替换问题。 - 解密函数重构:使用预先定义的
sec反向字典,同样采用逐个字符遍历的方式,直接从字典中查找原字符,彻底解决顺序替换引发的错误。 - 容错处理:通过
dict.get()方法,当输入字符不在映射字典中时,保留原字符,提升程序鲁棒性。
内容的提问来源于stack exchange,提问作者parsa ataei
相关产品推荐
相关产品推荐

