我有一个输入,它是一个字符串元组,用 a1z26 密码编码:1 到 26 的数字表示字母,连字符表示相同的单词字母,空格表示单词之间的空格。例如:8-9 20-8-5-18-5 应该翻译成“你好”假设最后一个示例是名为 string 的 var 中的元组string = ('8-9','20-8-5-18-5')我发现合乎逻辑的第一件事是使用字符串 = 列表(字符串)所以现在string = ['8-9','20-8-5-18-5']现在的问题是,当我遍历列表以将其与具有翻译值的字典进行比较时,两位数被视为一个数字,因此,例如,不是翻译“20”,而是先翻译“2”,然后再翻译“ 0',导致字符串说 'hi bheahe' (2 =b, 1 = a and 8 = h)所以我需要一种方法将上面的列表转换为下面的列表['8','-','9',' ','20','-','8','-','5','-','18','-','5',]我已经尝试过使用各种代码list()、join() 和 split()但它最终给了我同样的问题。总而言之,我需要将任何给定的列表(从输入元组转换而来)制作成一个字符列表,该列表完全考虑了两位数、空格和连字符这是我到目前为止所得到的。(我最后写的)输入在代码(字符串)中更上一层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]
3 回答
森栏
TA贡献1810条经验 获得超5个赞
我认为,最好在那里应用正则表达式。
例子:
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']
慕工程0101907
TA贡献1887条经验 获得超5个赞
无需将元组转换为列表。元组也是可迭代的。
我不认为你提到的名单是你真正想要的。您可能想要一个 2d 可迭代对象(不一定是列表,正如您将在下面看到的,我们可以一次性完成此操作而无需生成中间列表),其中每个项目对应一个单词并且是一个字符编号列表:
[[8, 9], [20, 8, 5, 18, 5]]
由此,您可以将每个数字转换为一个字母,将这些字母连接在一起形成单词,然后用空格连接单词。
为此,您需要向 split 传递一个参数,以告诉它如何拆分您的输入字符串。您可以使用一个衬垫来实现所有这些:
plaintext = ' '.join(''.join(num_to_letter[int(num)] for num in word.split('-')) for word in ciphertext.split(' '))
这正是如上所述的拆分过程,然后对每个数字查看字典num_to_letter
以进行转换。
请注意,您甚至不需要这个 dict。您可以使用 Unicode 中的 AZ 是连续的这一事实,因此您可以将 1-26 转换为 AZ chr(ord('A') + num - 1)
。
添加回答
举报
0/150
提交
取消