我需要将一串数字转换成一串字母来形成单词 例: 如果你的程序输入是 1920012532082114071825463219200125320615151209190846它应该返回 保持饥饿。保持愚蠢。
到目前为止,我有这个:
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)
感谢您的帮助
答案 0 :(得分: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')]
接下来将其传递给地图,并使用'.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,转换为ints:
>>> 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]
现在将其传递给带有lambda的map来执行解码逻辑:
>>> 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 :(得分:1)
您可以使用str
将zip()
拆分为两个字符的块,并使用以下步骤切片:
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")
将逻辑与输入和输出分开更有用,因此您可以在程序的其他部分使用该功能。避免重复使用number
或input
(内置)等名称也是一个好主意。
答案 2 :(得分:0)
''.join(map(lambda n: [chr(n),chr(n+96)][n<=26], map(int,map(''.join,zip(*[iter(s)]*2)))))