Skip to main content
 首页 » 编程设计

python之在 Python 中将 5A2B4C11G 字符串转换为 [(5 ,"A"),(2 ,"B"),(4 ,"C"),(11 ,"G")]

2025年05月04日23yyy_WW

标题几乎说明了一切。我有一个小游程解码脚本:

def RLdecode(characterList): 
    decodedString = "" 
    for character, count in characterList: 
        decodedString += character.upper() * count 
    return decodedString 

该脚本需要一个如下所示的列表(或其他任何内容):

[(5,"A"),(2,"B"),(4,"C"),(11,"G")] 

但是为了更方便用户,我希望用户能够输入这样的字符串:

"5A2B4C11G" 

我如何将上面的字符串转换为我的脚本可读的列表?另外,很抱歉,问题的标题很具体,但我不知道这个过程叫什么:\

请您参考如下方法:

使用itertools.groupby:

有一种使用 itertools.groupby 进行字母/数字分组的好方法:

import itertools 
a="5A2B4C11G" 
result = [("".join(v)) for k,v in itertools.groupby(a,str.isdigit)] 

返回 ['5', 'A', '2', 'B', '4', 'C', '11', 'G']

不幸的是,它扁平化了数字/字母元组,因此需要做更多的工作。请注意,既然数字/字母已正确完成,那么对该输入应用 Kaushik 解决方案会给出预期结果:

[(int(result[i]),result[i+1]) for i in range(0,len(result),2)] 

结果:

[(5, 'A'), (2, 'B'), (4, 'C'), (11, 'G')] 

使用正则表达式:

无论如何,在那种情况下,正则表达式非常适合提取具有所需层次结构的模式。

只需使用 1 个或多个数字 + 一个字母来匹配字符串,并将获得的元组转换为匹配 (integer, string) 格式,使用列表理解在一行中这样做。

import re 
a="5A2B4C11G" 
 
result = [(int(i),v) for i,v in re.findall('(\d+)([A-Z])',a)] 
 
print(result) 

给出:

[(5, 'A'), (2, 'B'), (4, 'C'), (11, 'G')]