Python Forum
list of string combinations - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: list of string combinations (/thread-18511.html)



list of string combinations - Skaperen - May-21-2019

the bash shell for Unix has a feature that allows using a text token like {a,b}{c,d}{e,f} and produces all combinations as if ace acf ade adf bce bcf bde bdf had been used in its place. has anyone seen or written a Python function that can do this to a string, maybe returning a list, such as:

string_combos('{a,b}{c,d}{e,f}') => ['ace','acf','ade','adf','bce','bcf','bde','bdf']


RE: list of string combinations - scidam - May-21-2019

It is Cartesian product of sets:

from itertools import product
list(map(''.join, product('abc', 'def','hg')))



RE: list of string combinations - Skaperen - May-21-2019

i'm looking for something that can (also) parse that particular syntax.


RE: list of string combinations - michalmonday - May-21-2019

What do you mean by "parse that particular syntax"?


RE: list of string combinations - Skaperen - May-22-2019

look at the function call i showed and the string being passed to the function. this is the syntax that works in bash. i want to support that syntax in programs i write that take user input.


RE: list of string combinations - michalmonday - May-22-2019

from itertools import product
import re

def string_combos(s):
    # get all expressions inside brackets into a list
    brackets = re.findall(r'{(.+?)}', s)

    # remove comas 
    joined_chars_list = [''.join(b.split(',')) for b in brackets]

    # In the above line the b.split(',') could be turned into another
    # list comprehension to remove whitespace if it is acceptable as
    # a part of input string

    # E.g. if this is acceptable:
    # string_combos('{a, b}{ c , d}{ e,   f}')

    # Then use something like:
    # [char_part.strip() for char_part in b.split(',')]
    
    return [''.join(p) for p in product(*joined_chars_list)] # copy of what scidam posted but I find this way easier to read than "list(map(" way
    
result = string_combos('{a,b}{c,d}{e,f}')
print(result)
Output:
['ace', 'acf', 'ade', 'adf', 'bce', 'bcf', 'bde', 'bdf']



RE: list of string combinations - Skaperen - May-22-2019

try this: print(len(string_combos('{0,1,2}'*15)))


RE: list of string combinations - michalmonday - May-22-2019

What for?

Output of this line in bash:
echo {0,1,2}{0,1,2}

is the same as output of this line in the python program posted above:
string_combos('{0,1,2}{0,1,2}')

So I assume it works as expected.

'{0,1,2}'*15 in python evaluates to '{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}{0,1,2}'

The input you're suggesting to test is taking ages to compute in bash (by prepending it with 'echo'), and ages to compute in python code I posted because there's just too many combinations. I don't get what's your point...

Or did you mean to test '{0,1,2}*15' (where *15 is included within the string)?
In such case I'd suggest to use subprocess to just execute it with bash using echo.


RE: list of string combinations - Skaperen - May-22-2019

my point is diversity in testing. i guess my computer is faster or has more RAM to swap less since it only took about 3.9 seconds for me. i wanted to be sure that the code was not limited to the scope of my original example. i ran it here on Python 3.5.2 on Ubuntu 16.04.6.