将数字字符串转换为字母 Python

1 投票
4 回答
5958 浏览
提问于 2025-04-17 04:03

我需要把一串数字转换成字母,形成单词。
举个例子:如果你程序的输入是
1920012532082114071825463219200125320615151209190846,输出应该是
stay hungry. stay foolish。

到目前为止,我有这些:

def number ():
output = []
input = raw_input ("please enter a string of numbers: ")
for number in input:
    if number <= 26:
        character = chr(int(number+96))
        output.append(character)
    else:
        character = chr(int(number))
        output.append(character)
print output

我需要让程序以某种方式判断每两个数字对应一个字母。
我有一个程序可以做这个的反向操作,给字母时输出数字。这个程序是这样的:

def word ():
output = []
input = raw_input("please enter a string of lowercase characters: ")
for character in input:
    number = ord(character) - 96
    if number > 0:
        if number <= 9:
            output.append('0' + str(number))
        else:
            output.append(str(number))
    else:
        output.append(str(number + 96))
print ''.join(output)

谢谢你的帮助。

4 个回答

0
''.join(map(lambda n: [chr(n),chr(n+96)][n<=26], map(int,map(''.join,zip(*[iter(s)]*2)))))

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

4

首先,创建一个针对你输入字符串的单一迭代器,然后像这样调用zip:

it = iter(data)
pairs = zip(it, it)

这样会得到:

[('1', '9'), ('2', '0'), ('0', '1'), ('2', '5'), ('3', '2'), ('0', '8'), ('2', '1'), ('1', '4'), ('0', '7'), ('1', '8'), ('2', '5'), ('4', '6'), ('3', '2'), ('1', '9'), ('2', '0'), ('0', '1'), ('2', '5'), ('3', '2'), ('0', '6'), ('1', '5'), ('1', '5'), ('1', '2'), ('0', '9'), ('1', '9'), ('0', '8'), ('4', '6')]

接下来,把这个结果传给map,使用一个''.join的函数来生成整数形式的字符串:

>>> map(''.join, zip(it,it))
['19', '20', '01', '25', '32', '08', '21', '14', '07', '18', '25', '46', '32', '19', '20', '01', '25', '32', '06', '15', '15', '12', '09', '19', '08', '46']

然后再把这个结果传给map,转换成整数:

>>> map(int, map(''.join, zip(it,it)))
[19, 20, 1, 25, 32, 8, 21, 14, 7, 18, 25, 46, 32, 19, 20, 1, 25, 32, 6, 15, 15, 12, 9, 19, 8, 46]

接着,再次把这个结果传给map,使用一个lambda函数来执行你的解码逻辑:

>>> map(lambda n : chr(n+96) if n < 27 else chr(n), map(int, map(''.join, zip(it,it))))
['s', 't', 'a', 'y', ' ', 'h', 'u', 'n', 'g', 'r', 'y', '.', ' ', 's', 't', 'a', 'y', ' ', 'f', 'o', 'o', 'l', 'i', 's', 'h', '.']

最后,把这个结果传给''.join:

>>> ''.join(map(lambda n : chr(n+96) if n < 27 else chr(n), map(int, map(''.join, zip(it,it)))))
'stay hungry. stay foolish.'

还有比这更简单的吗? :)

1

你可以用 zip() 函数和切片的方法,把 str 字符串分成两个字符一组,像这样:

for pair in zip(input[::2], input[1::2]):
    number = "".join(pair)

我会把整个过程写成这样:

def int_str_to_chr_str(int_str):
    res = []
    for pair in zip(int_str[::2], int_str[1::2]):
        number = int("".join(pair))

        if number <= 26:
            number += 96

        res.append(chr(number))

    return "".join(res)

print int_str_to_chr_str("1920012532082114071825463219200125320615151209190846")

把逻辑和输入输出分开是更有用的,这样你就可以在程序的其他部分使用这个函数。同时,避免重复使用像 numberinput 这样的名字(因为 input 是一个内置函数)也是个好主意。

撰写回答