Python编码解码程序优化:解码时保留末尾为ub的字符
搞定解码时末尾"ub"误删的问题
嘿,我来帮你解决这个解码逻辑的小bug!咱们先理清楚核心需求:编码时给元音前加"ub",解码时要删掉这些编码出来的"ub",但句子末尾原本就有的"ub"(比如"club"的最后两位)必须保留。
先看看现有解码代码的问题:它会把所有"ub"都跳过,不管是不是编码时添加的,这就导致像"club"这类词解码后变成了"cl"。下面是修正后的完整代码,我会一步步给你讲改动点:
from pcinput import getString while True: zin = getString("Give a sentence") cd = getString("Coding or decoding (c/d)") cd = cd.lower() klinkers = ("eaiou") nieuwe_zin = "" zin = zin.lower() if cd == "c": # 编码逻辑保持不变,改成直接遍历字符更简洁 for char in zin: if char in klinkers: nieuwe_zin += "ub" + char else: nieuwe_zin += char print(nieuwe_zin) break elif cd == "d": i = 0 zin_length = len(zin) # 只遍历到倒数第三个字符,留最后两位单独处理 while i < zin_length - 2: # 只有当"ub"后面跟着元音时,才跳过这两个字符(这是编码时额外加的) if zin[i:i+2] == "ub" and zin[i+2] in klinkers: i += 2 nieuwe_zin += zin[i] i += 1 # 处理最后两个字符:不管是不是"ub",直接保留 if zin_length >= 2: nieuwe_zin += zin[-2:] elif zin_length == 1: nieuwe_zin += zin[-1] print(nieuwe_zin) break else: print("Please enter C or D")
关键改动说明:
- 编码逻辑优化:把原来通过索引遍历的方式改成直接遍历字符,代码更简洁易读,功能完全不变。
- 解码逻辑拆分:
- 遍历范围限制在倒数第三个字符之前,这样不会提前碰最后两位。只有确认
ub后面跟着元音时,才跳过这两个字符——这才是编码时为元音添加的ub。 - 单独处理最后两位:不管这两位是不是
ub,都直接追加到结果里,像"club"这类词的末尾ub就会被保留。
- 遍历范围限制在倒数第三个字符之前,这样不会提前碰最后两位。只有确认
- 边界情况处理:考虑了句子长度小于2的情况(比如只有1个字符),避免出现索引错误。
测试示例:
- 编码"club":因为"u"是元音,编码后变成
clubub - 解码"clubub":会跳过中间编码生成的
ub,保留末尾的ub,最终得到club - 解码"club":直接保留所有字符,结果还是
club
这样就完美解决了末尾ub被误删的问题啦!
内容的提问来源于stack exchange,提问作者Luke Coopman
相关产品推荐
相关产品推荐

