Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Python 3 generator expression

def gen_letters(s,l):
    def __gen(s,l):
    if l > 1:
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            __gen(s+c,l-1)
    else:
        print(1)
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            yield s+c
    return __gen(s,l)

I am trying to generate all combinations of letters in the alphabet of length "l". The intended use for this functions is:

combos = gen_letters('', 10)

The second argument being the length of the combinations to return.
For instance, if I wanted to generate all possible 3 char length strings from the alphabet and a space, I should get 19683 combinations. When trying to use "next(combos)" or "for combo in combos:" (even on the first next()) I get this error:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

Help is much appreciated 🙂

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

No need for nested functions and your base case can be even simpler:

def gen_letters(l):
    if not l:
        yield ""
    else:
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            for combo in gen_letters(l-1):
                yield c + combo


    
[*gen_letters(2)]
# ['aa', 'ab', ..., ' x', ' y', ' z', '  ']

Or, closer to your original:

def gen_letters(s,l):
    if l:
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            yield from gen_letters(s+c,l-1)
    else:
        yield s

[*gen_letters('', 2)]
# ['aa', 'ab', ..., ' x', ' y', ' z', '  ']

Notice the yield from line. This is where you did the correct recursive call, but did not do anything with the result.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading