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

新手上路,请多包涵

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

例如,让:

 x = 'abc'

我希望输出类似于:

 ['abc', 'ab', 'ac', 'bc', 'a', 'b', 'c']

重点是我们可以去掉原字符串中不相邻的多个字符(以及相邻的字符)。

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

 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'))

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

另一个例子是如果我们使用字符串 'abcde' ,输出列表应该包含元素 'ace' , 'bd' 等等。

原文由 aL_eX 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 688
2 个回答

您可以使用 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']

如果你想要它以相反的顺序,你可以让 range 函数以相反的顺序返回它的序列

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

原文由 Sunitha 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个有趣的练习。我认为其他答案可能使用 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']

原文由 davidlowryduda 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题