## Issue

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.

## Solution

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

Answered By – Sunitha

Answer Checked By – David Goodson (BugsFixing Volunteer)