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
.
归档时间: |
|
查看次数: |
11513 次 |
最近记录: |