- A+

I've seen many questions on getting all the possible substrings (i.e., adjacent sets of characters), but none on generating all possible strings including the combinations of its substrings.

For example, let:

`x = 'abc' `

I would like the output to be something like:

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

The main point is that we can remove multiple characters that are not adjacent in the original string (as well as the adjacent ones).

Here is what I have tried so far:

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

However, this only removes sets of adjacent strings from the original string, and will not return the element `'ac'`

from the example above.

Another example is if we use the string `'abcde'`

, the output list should contain the elements `'ace'`

, `'bd'`

etc.

You can do this easily using `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'] `

If you want it in the reversed order, you can make the `range`

function return its sequence in reversed order

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