以特定方式分隔列表的每个项目

时间:2018-12-25 00:26:53

标签: python

我有一个输入,它是一个字符串的元组,以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] 

5 个答案:

答案 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']

上述代码的说明:

  1. 用定界符'-'分割每个字符串。
  2. 创建穿插的分隔符。
  3. 使用itertools.zip_longest创建成对的字符和分隔符。
  4. 使用itertools.chain.from_iterable将扁平化的对扩展到结果列表。
  5. 从结果列表中删除尾随' '

您还可以创建自己的散布生成器函数并将其应用两次:

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']