我有一個輸入,它是一個字符串元組,用 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
提交
取消