我有一个输入,它是一个字符串元组,以 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']
现在的问题是,当我迭代列表以将其与具有翻译值的字典进行比较时,双位数被视为 1,因此,例如,不是翻译“20”,而是翻译“2”然后是“0”,结果是字符串“hi bheahe”(2 =b、1 = a 和 8 = h)
所以我需要一种方法将上面的列表转换为下面的 列表
['8','-','9',' ','20','-','8','-','5','-','18','-','5',]
我已经尝试过使用各种代码
list(), join() and 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]
最佳答案
无需将元组转换为列表。元组也是可迭代的。
我认为您列出的列表并不是您真正想要的。您可能需要一个二维可迭代(不一定是一个列表,正如您将在下面看到的,我们可以一次性完成此操作,而无需生成中间列表),其中每个项目对应于一个单词,并且是字符编号的列表:
[[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
进行转换。
请注意,您甚至不需要这个字典。您可以利用 unicode 中的 A-Z 是连续的这一事实,因此要将 1-26 转换为 A-Z,您可以执行 chr(ord('A') + num - 1)
。
关于python - 以特定方式分隔列表中的每个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53918541/