给出字符串“ lion”应得到以下子字符串输出, [“ ion”,“ lin”,“ in”,“ io”,“ li”,“ on”,“ lion”]
这是我到目前为止所拥有的,
def Substring(n):
sub = [n]
if len(n) > 2:
sub.extend(Substring(n[1:]))
sub.extend(Substring(n[:-1]))
return list(sub)
我当前的输出是['lion','ion','on','io','lio','io','li']
我缺少子字符串“ lin”和“ in”,我不应该有“ lio”。
如果我需要其他方法或需要其他语句,我无法弄清楚吗?
答案 0 :(得分:0)
您可以在可能的子字符串的每个长度上使用itertools.combinations
:
from itertools import combinations
def substring_combinations(s, min_length):
result = []
# Check that minimum length is valid
if not min_length:
return result
# For each possible length append all substring combinations
for i in range(min_length, len(s)+1):
for combination in combinations(s, i):
result.append(''.join(combination))
return result
>>> print(substring_combinations('lion', 2))
['li', 'lo', 'ln', 'io', 'in', 'on', 'lio', 'lin', 'lon', 'ion', 'lion']
在您的示例中,我想您会错过一些有效的选项。
我函数中的每个输出都是lion
的子字符串。
答案 1 :(得分:0)
有一个单行代码,不需要itertools
。根据您的习惯,它可能会或多或少清晰易懂。
tuple(s[i:i+j+1] for i in range(len(s)) for j in range(len(s)-i))
# ('l', 'li', 'lio', 'lion', 'i', 'io', 'ion', 'o', 'on', 'n')
请注意,tuple
类型仅用于打印;没有它,Python会为您提供一个生成器,如果您对其进行迭代,效率会更高。
对于长度为2或更大的子字符串:
tuple(s[i:i+j+1] for i in range(len(s)) for j in range(1, len(s)-i))
# ('li', 'lio', 'lion', 'io', 'ion', 'on')
答案 2 :(得分:0)
这是不涉及使用任何特殊库的解决方案。
基本思路:
查看字符串的第一个字符。可能的子字符串可以包含它,也可以错过它。
def get_all_substrings_recursively(s):
if len(s) == 0:
return ['']
# recursive call to get all substrings of s without first char
substrings = get_all_substrings_recursively(s[1:])
# return all substrings with and without the first char of s
return [(s[0] + substr) for substr in substrings] + substrings