在给定分隔符的情况下,生成字符串中子字符串长度列表的最快方法是什么?

2024-06-25 23:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串,我需要生成一个列表,列出以给定分隔符结尾的所有子字符串的长度。你知道吗

例如:string='a0ddb0gf0',separator='0',所以我需要生成:lengs=[2,4,3],因为len('a0')==2,len('ddb0')=4,len('gf0')==3。你知道吗

我知道可以通过以下方法来实现(例如):

separators = [index for index in range(len(string)) if string[index]==separator]
lengths = [separators[index+1] - separators[index] for index in range(len(separators)-1)]

但我需要它做得非常快(对大量的数据)。为大量数据生成中间列表非常耗时。你知道吗

有没有一个解决方案可以快速而整洁地完成这项工作(py2.7)?你知道吗


Tags: 数据字符串in列表forstringindexlen
3条回答

我不知道这会有多快,但还有一个办法:

def len_pieces(s, sep):
    i = 0
    while True:
        f = s.find(sep, i)
        if f == -1:
            yield len(s) - i
            return
        yield f - i + 1
        i = f + 1

最快的?不知道。你可能会想分析一下。你知道吗

>>> print [len(s) for s in 'a0ddb0gf0'.split('0')]
[1, 3, 2, 0]

如果你真的不想包含零长度的字符串:

>>> print [len(s) for s in 'a0ddb0gf0'.split('0') if s]
[1, 3, 2]

我个人喜欢^{}

>>> from itertools import groupby
>>> sep = '0'
>>> data = 'a0ddb0gf0'
>>> [sum(1 for i in g) for (k, g) in groupby(data, sep.__ne__) if k]
[1, 3, 2]

这将根据每个元素是否等于分隔符对数据进行分组,然后获取元素不相等的每个组的长度(通过对组中的每个项求和1)。你知道吗

itertools函数通常相当快,尽管我不确定这比split()好多少。我认为有一点非常有利于它,那就是它可以无缝地处理分隔符字符的多次连续出现。它还将处理data的任何iterable,而不仅仅是字符串。你知道吗

相关问题 更多 >