在Python中获取字符串及其子字符串的所有组合

aL_*_*_eX 14 python string

我已经看到很多关于获取所有可能的子串(即,相邻的字符集)的问题,但没有关于生成所有可能的字符串,包括其子串的组合.

例如,让:

x = 'abc'
Run Code Online (Sandbox Code Playgroud)

我希望输出类似于:

['abc', 'ab', 'ac', 'bc', 'a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

重点是我们可以删除原始字符串中不相邻的多个字符(以及相邻的字符).

这是我到目前为止所尝试的:

def return_substrings(input_string):
    length = len(input_string)
    return [input_string[i:j + 1] for i in range(length) for j in range(i, length)]

print(return_substrings('abc'))
Run Code Online (Sandbox Code Playgroud)

但是,这只会从原始字符串中删除相邻字符串集,并且不会返回'ac'上面示例中的元素.

另一个例子是,如果我们使用字符串'abcde',输出列表应该包括的内容'ace','bd'等等.

Sun*_*tha 19

你可以轻松地使用它 itertools.combinations

>>> from itertools import combinations
>>> x = 'abc'
>>> [''.join(l) for i in range(len(x)) for l in combinations(x, i+1)]
['a', 'b', 'c', 'ab', 'ac', 'bc', 'abc']
Run Code Online (Sandbox Code Playgroud)

如果您想以相反的顺序使用它,则可以使range函数以相反的顺序返回其序列

>>> [''.join(l) for i in range(len(x),0,-1) for l in combinations(x, i)]
['abc', 'ab', 'ac', 'bc', 'a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)


dav*_*uda 5

这是一个有趣的练习。我认为其他答案可以使用itertools.product或itertools.combinations。但是,只是为了好玩,您还可以使用类似的方法来递归地执行此操作

def subs(string, ret=['']):
    if len(string) == 0:
        return ret
    head, tail = string[0], string[1:]
    ret = ret + list(map(lambda x: x+head, ret))
    return subs(tail, ret)

subs('abc')
# returns ['', 'a', 'b', 'ab', 'c', 'ac', 'bc', 'abc']
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

5778 次

最近记录:

6 年,3 月 前