如何将Python列表中的后续数字合并为两位(或更多)数字

如何将Python列表中的后续数字合并为两位(或更多)数字,python,Python,我有以下字符串: string = 'TAA15=ATT' 我列出了一张清单: string_list = list(string) print(string_list) 结果是: ['T', 'A', 'A', '1', '5','=', 'A', 'T', 'T'] 我需要检测后续的数字并将它们合并成一个数字,如下所示: ['T', 'A', 'A', '15','=', 'A', 'T', 'T'] 我也很关心表演。这个字符串转换要进行上千次 感谢您提供的任何提示。使用iterto

我有以下字符串:

string = 'TAA15=ATT'
我列出了一张清单:

string_list = list(string)
print(string_list)
结果是:

['T', 'A', 'A', '1', '5','=', 'A', 'T', 'T']
我需要检测后续的数字并将它们合并成一个数字,如下所示:

['T', 'A', 'A', '15','=', 'A', 'T', 'T']
我也很关心表演。这个字符串转换要进行上千次


感谢您提供的任何提示。

使用
itertools.groupby

Ex:

from itertools import groupby
string = 'TAA15=ATT'

result = []
for k, v in groupby(string, str.isdigit):
    if k:
        result.append("".join(v))
    else:
        result.extend(v)
print(result)
['T', 'A', 'A', '15', '=', 'A', 'T', 'T']
输出:

from itertools import groupby
string = 'TAA15=ATT'

result = []
for k, v in groupby(string, str.isdigit):
    if k:
        result.append("".join(v))
    else:
        result.extend(v)
print(result)
['T', 'A', 'A', '15', '=', 'A', 'T', 'T']

您可以在Python库
re
中使用正则表达式:

import re
string = 'TAA15=ATT'
num = re.sub('[^0-9,]', "", string)
pos = string.find(num)
str2 = re.sub('\\d+',"", string)
str2 = re.sub('=',"", str2)
print(str2)
l = list()
for el in str2:
    l.append(el)
l.insert(pos, num)
print(l)
基本上,
re.sub(“[^0-9,]”,“,”,string)
告诉我们:获取字符串,匹配所有不是(
^
表示否定)数字(
0-9
)的字符,并用第二个参数(即空字符串)替换它们。所以基本上剩下的只是你必须转换成整数的数字

如果
=
始终在数字后面,而不是

str2 = re.sub('\\d+',"", string)
str2 = re.sub('=',"", str2)
你能行

str2 = re.sub('\\d+=',"", string)

这里有一个非常简短的解决方案

import re

def digitsMerger(source):
    return re.findall(r'\d+|.', source)
另一个regexp:

import re

s = 'TAA15=ATT'

pattern = r'\d+|\D'

m = re.findall(pattern, s)

print(m)

您可以创建一个比较上一个值和下一个值的函数,并使用
functools.reduce

from functools import reduce

string_list = ['T', 'A', 'A', '1', '5', 'A', 'T', 'T']

def combine_nums(lst, nxt):
    if lst and all(map(str.isdigit, (lst[-1], nxt))):
        nxt = lst[-1] + nxt
    return lst + [nxt]

print(reduce(combine_nums, string_list, [])
结果:

['T', 'A', 'A', '1', '15', 'A', 'T', 'T']

您的任务是合并字符串列表中的连续数字,还是实际任务是从字符串中提取连续数字?关于“我把它列成一个列表:
=
到哪里去了?@MisterMiyagi:合并连续的数字。我忘了在创建列表之前删除字符串中的“=”。谢谢你你到底要不要等号?在你的问题中,你没有这样说,但你接受了一个答案。
=
总是在数字后面吗?为了我的问题,等号是不相关的。我不想制造混乱,因为我接受了带有“=”符号的答案,所以我通过将“=”放回字符串列表来编辑问题。对不起,我的错误。我确实需要检测列表中的两位数,但也需要用[..,'1','5',…]修改列表,以获得[..,'15',…]我修改了答案中的代码:现在它应该工作得很好。但是说:
else:result.extend(v)
(无需创建列表)就足够了,而且效率更高。与其使用
lambda x:x.isdigit()
use
str.isdigit
FWIW,在我的桌面上,这个解决方案比使用itertools.groupby的解决方案花费的时间大约少1/3。真的很好,你能解释一下吗?我的意思是它是否匹配一系列数字(放在一起)或任何其他字符?正则表达式首先查找一个数字,如果找到了,它会尝试获取尽可能多的数字。如果它找不到任何数字,它只需要1个字符(
是最大的通配符,
\D
也可以表示“除了数字以外的任何东西”),我不知道这是否可以被描述为一个问题(这显然不是提出问题的OP的问题)但是第二个问题被贴出来了,经常有几个人准备跳上去。所以,你努力工作,想出一个解决方案,却发现有人在你之前几分钟提出了基本相同的解决方案。或者一些法官认为这个问题太类似于一个已经被问过和回答过的问题,而你甚至不能发布你的作品。“我现在发现自己不必费心回答新问题,除非这些问题已经有一段时间没有人回答了。”罗纳德·阿伦森说得好,我明白你的担心。我刚刚尝试了一些更适合我的代码的答案,被接受的答案又短又快。一旦我得到了我所需要的,我就没有试过其他的,我理解这是不公平的。@Ronaldaronson我知道你的意思,是的,有三种类型的Q。第1名:含义(~20%)。第二个定义明确,但不是真正的问题,如(~50%)第三个:真正的问题,大多数情况下仍然没有答案。。。无论如何,我们应该过滤这个问题。有没有讨论这个问题的元线程?