首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以特定方式将列表中的每一项分开。

以特定方式将列表中的每一项分开。
EN

Stack Overflow用户
提问于 2018-12-25 00:26:53
回答 5查看 254关注 0票数 2

我有一个输入,它是一个字符串的元组,用a1z26密码编码:从1到26的数字代表字母,连字符代表相同的单词字母,空格代表单词之间的空格。例如: 8-9 20-8-5-18-5应该翻译成“嗨”。

假设最后一个例子是一个名为string的var中的元组

代码语言:javascript
运行
复制
string = ('8-9','20-8-5-18-5')

我发现逻辑的第一件事是使用以下方法将元组转换为列表

string = list(string)

所以现在

代码语言:javascript
运行
复制
string = ['8-9','20-8-5-18-5']

现在的问题是,当我遍历列表,将其与具有已翻译值的字典进行比较时,两位数被视为一个数字,因此,它不是翻译'20‘,而是翻译'2’然后'0',从而导致字符串“hi bheahe”(2 =b,1=a和8= h)。

因此,我需要一种方法将上面的列表转换为下面的列表

代码语言:javascript
运行
复制
['8','-','9',' ','20','-','8','-','5','-','18','-','5',]

我已经尝试过不同的代码

列表()、联接()和拆分()

但最终还是给了我同样的问题。

总之,我需要将任何给定的列表(从输入元组转换)变成一个考虑到两位数、空格和连字符的字符列表。

到目前为止,这就是我所掌握的。(上次我写的)输入在代码(字符串)中的更高的位置。

代码语言:javascript
运行
复制
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] 
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-12-25 01:51:33

你真的不需要催眠,对吗?

我建议你采取以下办法:

代码语言:javascript
运行
复制
a = '- -'.join(string).split('-')

现在a['8', '9', ' ', '20', '8', '5', '18', '5']

然后,您可以使用字典将每个数字转换为正确的字符。

代码语言:javascript
运行
复制
b = ''.join([a1z26[i] for i in a])

现在b等于HI THERE

票数 0
EN

Stack Overflow用户

发布于 2018-12-25 00:37:27

没有必要将元组转换为列表。元组也是可迭代的。

我不认为你真正想要的是你的名单。您可能需要一个2d可迭代(不一定是一个列表,如下所示,我们可以在不生成中间列表的情况下一次完成这个任务),其中每个项对应于一个单词,是一个字符号的列表:

代码语言:javascript
运行
复制
[[8, 9], [20, 8, 5, 18, 5]]

从这里,你可以把每个数字转换成一个字母,把字母连在一起形成单词,然后用空格连接单词。

要做到这一点,您需要传递一个参数来拆分,告诉它如何拆分输入字符串。您可以通过一个衬垫来实现所有这一切:

代码语言:javascript
运行
复制
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)

票数 5
EN

Stack Overflow用户

发布于 2018-12-25 01:21:57

我认为,最好在那里应用正则表达式。

示例:

代码语言:javascript
运行
复制
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)

结果:

代码语言:javascript
运行
复制
['8', '-', '9', ' ', '20', '-', '8', '-', '5', '-', '18', '-', '5']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53918541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档