Getting all combinations of a string by removing any number of characters

  • A+

I've seen may questions on getting all the possible substrings (i.e., adjacent sets of characters), but none on generating all possible strings by removing any number of characters.

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


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: