我有一个输入,它是一个字符串的元组,以a1z26密码编码:1到26的数字表示字母,连字符表示相同的单词字母,空格表示单词之间的空格。 例如: 8-9 20-8-5-18-5应该翻译为“嗨”
让我们说最后一个例子是一个名为string的变量中的元组
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]
答案 0 :(得分:5)
无需将元组转换为列表。元组也是可迭代的。
我认为您所列出的列表并不是您真正想要的。您可能想要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(' '))
这完全按照上述步骤进行拆分,然后对每个数字查询字典num_to_letter
进行转换。
请注意,您甚至不需要此字典。您可以使用Unicode中的A-Z是连续的事实,因此您可以执行chr(ord('A') + num - 1)
来将1-26转换为A-Z。
答案 1 :(得分:0)
我认为,最好在此应用正则表达式。
示例:
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']
答案 2 :(得分:0)
在这里使用正则表达式是解决方案
import re
string = '8-9 20-8-5-18-5'
exp=re.compile(r'[0-9]+|[^0-9]+')
data= exp.findall(string)
print(data)
输出
['8', '-', '9', ' ', '20', '-', '8', '-', '5', '-', '18', '-', '5']
如果要从输入字符串中获取hi there
,请使用以下方法(我假设所有字符均为大写):
import re
string = '8-9 20-8-5-18-5'
exp=re.compile(r'[0-9]+|[^0-9]+')
data= exp.findall(string)
new_str =''
for i in range(len(data)):
if data[i].isdigit():
new_str+=chr(int(data[i])+64)
else:
new_str+=data[i]
result = new_str.replace('-','')
输出:
HI THERE
答案 3 :(得分:0)
您真的不需要连字符,对吗?
我建议您采用以下方法:
a = '- -'.join(string).split('-')
现在a
是['8', '9', ' ', '20', '8', '5', '18', '5']
然后您可以使用字典将每个数字转换为正确的字符
b = ''.join([a1z26[i] for i in a])
现在b
等于HI THERE
答案 4 :(得分:0)
您也可以尝试以下itertools解决方案:
from itertools import chain
from itertools import zip_longest
def separate_list(lst, delim, sep=" "):
result = []
for x in lst:
chars = x.split(delim) # 1
pairs = zip_longest(chars, [delim] * (len(chars) - 1), fillvalue=sep) # 2, 3
result.extend(list(chain.from_iterable(pairs))) # 4
return result[:-1] # 5
print(separate_list(["8-9", "20-8-5-18-5"], delim="-"))
输出:
['8', '-', '9', ' ', '20', '-', '8', '-', '5', '-', '18', '-', '5']
上述代码的说明:
'-'
分割每个字符串。itertools.zip_longest
创建成对的字符和分隔符。itertools.chain.from_iterable
将扁平化的对扩展到结果列表。' '
。您还可以创建自己的散布生成器函数并将其应用两次:
from itertools import chain
def intersperse(iterable, delim):
it = iter(iterable)
yield next(it)
for x in it:
yield delim
yield x
def separate_list(lst, delim, sep=" "):
return list(
chain.from_iterable(
intersperse(
(intersperse(x.split(delim), delim=delim) for x in lst), delim=[sep]
)
)
)
print(separate_list(["8-9", "20-8-5-18-5"], delim="-"))
# ['8', '-', '9', ' ', '20', '-', '8', '-', '5', '-', '18', '-', '5']