Python程序中denary字符串转字符的修复方案

106 阅读3分钟

在 Python 程序中,将十进制(denary)字符串转为字符,通常需要将字符串表示的数字解释为字符的 ASCII 或 Unicode 编码。

1、问题背景

在Python中,有人遇到一个denary字符串转字符的问题,代码如下:

# Set to true if testing. Will show lists that show the process.
testing = True# Asks for the denary.
text = list(input('Enter the denary: '))
​
# Defining the list. 0 is there to allow the remover to work correctly.
doublesList = ['0']
​
# Split the numbers into doubles and append them to doublesList.
for i in range(len(text) - 1):
    current_item = text[i]
    next_item = text[i + 1]
    doubles = current_item + next_item
    doublesList.append(doubles)
​
if testing:
    print('\nunedited:\n', doublesList,'\n')
​
# Remove unnecessary numbers.
for item in doublesList:
    doublesList.remove(item)
​
if testing:
    print('edited:\n', doublesList,'\n')
​
# Replace the numbers with their letters.
​
for item in doublesList:
    if item == '01':
        doublesList[doublesList.index('01')] = 'a'
    elif item == '02':
        doublesList[doublesList.index('02')] = 'b'
    elif item == '03':
        doublesList[doublesList.index('03')] = 'c'
    elif item == '04':
        doublesList[doublesList.index('04')] = 'd'
    elif item == '05':
        doublesList[doublesList.index('05')] = 'e'
    elif item == '06':
        doublesList[doublesList.index('06')] = 'f'
    elif item == '07':
        doublesList[doublesList.index('07')] = 'g'
    elif item == '08':
        doublesList[doublesList.index('08')] = 'h'
    elif item == '09':
        doublesList[doublesList.index('09')] = 'i'
    elif item == '10':
        doublesList[doublesList.index('10')] = 'j'
    elif item == '11':
        doublesList[doublesList.index('11')] = 'k'
    elif item == '12':
        doublesList[doublesList.index('12')] = 'l'
    elif item == '13':
        doublesList[doublesList.index('13')] = 'm'
    elif item == '14':
        doublesList[doublesList.index('14')] = 'n'
    elif item == '15':
        doublesList[doublesList.index('15')] = 'o'
    elif item == '16':
        doublesList[doublesList.index('16')] = 'p'
    elif item == '17':
        doublesList[doublesList.index('17')] = 'q'
    elif item == '18':
        doublesList[doublesList.index('18')] = 'r'
    elif item == '19':
        doublesList[doublesList.index('19')] = 's'
    elif item == '20':
        doublesList[doublesList.index('20')] = 't'
    elif item == '21':
        doublesList[doublesList.index('21')] = 'u'
    elif item == '22':
        doublesList[doublesList.index('22')] = 'v'
    elif item == '23':
        doublesList[doublesList.index('23')] = 'w'
    elif item == '24':
        doublesList[doublesList.index('24')] = 'x'
    elif item == '25':
        doublesList[doublesList.index('25')] = 'y'
    elif item == '26':
        doublesList[doublesList.index('26')] = 'z'
    elif item == '27':
        doublesList[doublesList.index('27')] = ' '
    elif item == '28':
        doublesList[doublesList.index('28')] = '.'
    elif item == '29':
        doublesList[doublesList.index('29')] = ''
    elif item == '30':
        doublesList[doublesList.index('30')] = '\n'
​
# Print the finished list as a string.
print(''.join(doublesList))

使用上面的代码,输入denary数字"2908051212152830132527140113052709192702150228"应该返回"hello.\nmy name is bob."。然而,结果是"hello.my nam\ne is bob."。

2、解决方案

要修复此代码,可以使用以下解决方案:

  1. 在循环中遍历输入,然后将它们成对组合在一起,并将其转换为整数。
  2. 过滤出代码表中不存在的字符。
  3. 使用map将整数转换为字符。
  4. 将字符列表连接成字符串并将其打印出来。

以下是修复后的代码:

characters = ' abcdefghijklmnopqrstuvwxyz . \n'result = []
​
for pair in zip(text[::2], text[1::2]):
    codepoint = int(''.join(pair))
    if not (1 <= codepoint <= 30) or codepoint == 29: continue
    result.append(characters[codepoint])
print(''.join(result))

这个修复程序适用于所有有效的denary字符串,并返回正确的字符串结果。

总结

  • 使用 chr(int(num)) 进行十进制编码到字符的转换。
  • 对输入的格式和范围进行验证,防止非法字符或超范围值。
  • 通过通用函数支持不同的输入分隔符或格式。
  • 添加异常处理,确保程序稳定运行。

这些方案可以适配大多数场景,根据需求灵活应用即可。