使用Python的字符串子字符串

use*_*666 10 python string substring

你可以用字符串做多少个子abcd

我怎样才能得到它的所有子串:

['a', 'b', 'c', 'd', 'ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']
Run Code Online (Sandbox Code Playgroud)

Pla*_*ure 12

试试这个:

def consecutive_groups(iterable):
    s = tuple(iterable)
    for size in range(1, len(s)+1):
        for index in range(len(s)+1-size):
            yield iterable[index:index+size]

>>> print list(consecutive_groups('abcd'))
['a', 'b', 'c', 'd', 'ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']
Run Code Online (Sandbox Code Playgroud)

并且组合的数量简单地等于从1到字符串长度的总和,这相当于n * (n + 1) / 2.

顺便说一句,如果你想避免重复,你可以简单地在生成器函数中使用本地定义的集合,如下所示:

def consecutive_groups(iterable):
    s = tuple(iterable)
    seen = set()
    for size in range(1, len(s)+1):
        for index in range(len(s)+1-size):
            slc = iterable[index:index+size]
            if slc not in seen:
                seen.add(slc)
                yield slc
Run Code Online (Sandbox Code Playgroud)

该代码有点笨拙,可能会针对缩进进行优化,但它可以用于概念验证.


hoc*_*chl 10

这会吗?

import itertools
def substrings(x):
    for i, j in itertools.combinations(xrange(len(x)+1), 2):
        yield x[i:j]
Run Code Online (Sandbox Code Playgroud)

或作为生成器表达式:

(x[i:j] for i, j in itertools.combinations(xrange(len(x)+1), 2))
Run Code Online (Sandbox Code Playgroud)

您的示例的展开结果如下所示:

['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']
Run Code Online (Sandbox Code Playgroud)

要按长度排序,请使用排序key=len.