我有一个输入,它是一个字符串的元组,用a1z26密码编码:从1到26的数字代表字母,连字符代表相同的单词字母,空格代表单词之间的空格。例如: 8-9 20-8-5-18-5应该翻译成“嗨”。
假设最后一个例子是一个名为string的var中的元组
string = ('8-9','20-8-5-18-5')我发现逻辑的第一件事是使用以下方法将元组转换为列表
string = list(string)
所以现在
string = ['8-9','20-8-5-18-5']现在的问题是,当我遍历列表,将其与具有已翻译值的字典进行比较时,两位数被视为一个数字,因此,它不是翻译'20‘,而是翻译'2’然后'0',从而导致字符串“hi bheahe”(2 =b,1=a和8= h)。
因此,我需要一种方法将上面的列表转换为下面的列表
['8','-','9',' ','20','-','8','-','5','-','18','-','5',]我已经尝试过不同的代码
列表()、联接()和拆分()
但最终还是给了我同样的问题。
总之,我需要将任何给定的列表(从输入元组转换)变成一个考虑到两位数、空格和连字符的字符列表。
到目前为止,这就是我所掌握的。(上次我写的)输入在代码(字符串)中的更高的位置。
a1z26 = {'1':'A', '2':'B', '3':'C', '4':'D', '5':'E', '6':'F', '7':'G', '8':'H', '9':'I', '10':'J', '11':'K', '12':'L', '13':'M', '14':'N', '15':'O', '16':'P', '17':'Q', '18':'R', '19':'S', '20':'T', '21':'U', '22':'V', '23':'W', '24':'X', '25':'Y', '26':'Z', '-':'', ' ' : ' ', ', ' : ' '}
translation = ""
code = list(string)
numbersarray1 = code
numbersarray2 = ', '.join(numbersarray1)
for char in numbersarray2:
if char in a1z26:
translation += a1z26[char] 发布于 2018-12-25 01:51:33
你真的不需要催眠,对吗?
我建议你采取以下办法:
a = '- -'.join(string).split('-')现在a是['8', '9', ' ', '20', '8', '5', '18', '5']
然后,您可以使用字典将每个数字转换为正确的字符。
b = ''.join([a1z26[i] for i in a])现在b等于HI THERE
发布于 2018-12-25 00:37:27
没有必要将元组转换为列表。元组也是可迭代的。
我不认为你真正想要的是你的名单。您可能需要一个2d可迭代(不一定是一个列表,如下所示,我们可以在不生成中间列表的情况下一次完成这个任务),其中每个项对应于一个单词,是一个字符号的列表:
[[8, 9], [20, 8, 5, 18, 5]]从这里,你可以把每个数字转换成一个字母,把字母连在一起形成单词,然后用空格连接单词。
要做到这一点,您需要传递一个参数来拆分,告诉它如何拆分输入字符串。您可以通过一个衬垫来实现所有这一切:
plaintext = ' '.join(''.join(num_to_letter[int(num)] for num in word.split('-'))
for word in ciphertext.split(' '))这正是上面描述的拆分过程,然后对每个数字查看dict num_to_letter来进行转换。
请注意,你甚至不需要这个混蛋。您可以使用unicode中的A是连续的,因此要将1-26转换为A,可以执行chr(ord('A') + num - 1)。
发布于 2018-12-25 01:21:57
我认为,最好在那里应用正则表达式。
示例:
import re
...
src = ('8-9', '20-8-5-18-5')
res = [match for tmp in src for match in re.findall(r"([0-9]+|[^0-9]+)", tmp + " ")][:-1]
print(res)结果:
['8', '-', '9', ' ', '20', '-', '8', '-', '5', '-', '18', '-', '5']https://stackoverflow.com/questions/53918541
复制相似问题