Skip to main content
replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link
  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can categorise each letter, l in consonants. And then compare if they are the same.
  • You should use a function, as it can be fasterit can be faster
  • You should use a if __name__ == '__main__' guardif __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.
  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can categorise each letter, l in consonants. And then compare if they are the same.
  • You should use a function, as it can be faster
  • You should use a if __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.
  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can categorise each letter, l in consonants. And then compare if they are the same.
  • You should use a function, as it can be faster
  • You should use a if __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.
Fix typos
Source Link
janos
  • 111.7k
  • 15
  • 152
  • 391
  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can catigorisecategorise each letter, l in consonants. And then compaircompare if they are the same.
  • You should use a function, as it can be faster
  • You should use a if __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.

However, this is based around an inefficantinefficient usage of itertools.product. You instead want to pass it the arguments so that it'll create them efficiantlyefficiently. This is easy to do when n is even:

To, do this efficiantlyefficiently when n is odd, is also quite easy. You want to do roughly the same thing, but if the first item of the products is not the same as the first character of the first argument, then stop looping. And so you can use:

  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can catigorise each letter, l in consonants. And then compair if they are the same.
  • You should use a function, as it can be faster
  • You should use a if __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.

However, this is based around an inefficant usage of itertools.product. You instead want to pass it the arguments so that it'll create them efficiantly. This is easy to do when n is even:

To, do this efficiantly when n is odd, is also quite easy. You want to do roughly the same thing, but if the first item of the products is not the same as the first character of the first argument, then stop looping. And so you can use:

  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can categorise each letter, l in consonants. And then compare if they are the same.
  • You should use a function, as it can be faster
  • You should use a if __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.

However, this is based around an inefficient usage of itertools.product. You instead want to pass it the arguments so that it'll create them efficiently. This is easy to do when n is even:

To, do this efficiently when n is odd, is also quite easy. You want to do roughly the same thing, but if the first item of the products is not the same as the first character of the first argument, then stop looping. And so you can use:

Source Link
Peilonrayz
  • 43.5k
  • 7
  • 76
  • 155

Keeping the way that you're doing this at the moment, you can:

  • Change consonants to a string. This allows for easier readability, and may give better performance than a list.
  • Name constants in UPPER_SNAKE_CASE.
  • Using itertools.pairwise, you can remove all bar one if. This is as you can catigorise each letter, l in consonants. And then compair if they are the same.
  • You should use a function, as it can be faster
  • You should use a if __name__ == '__main__' guard.
  • You should use print ''.join(letters), rather than for j in letters: sys.stdout.write(j).
  • You can yield from the function instead, so that if it's not fast enough, you can group prints. Or use it in other ways.

This can lead to:

import itertools

CONSONANTS = 'bcdfghjklmnpqrstvwxz'
VOWELS = 'aeiou'


def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return izip(a, b)


def generate_answers(n):
    consonants = CONSONANTS
    for answer in itertools.product(consonants + VOWELS, repeat=n):
        letter_categories = (l in consonants for l in answer)
        if all(a != b for a, b in pairwise(letter_categories)):
            yield ''.join(answer)


if __name__ == '__main__':
    for answer in generate_answers(int(raw_input().strip())):
        print(answer)

However, this is based around an inefficant usage of itertools.product. You instead want to pass it the arguments so that it'll create them efficiantly. This is easy to do when n is even:

def generate_answers(n):
    return chain(product(CONSONANTS, VOWELS, repeat=n//2),
                 product(VOWELS, CONSONANTS, repeat=n//2))

To, do this efficiantly when n is odd, is also quite easy. You want to do roughly the same thing, but if the first item of the products is not the same as the first character of the first argument, then stop looping. And so you can use:

import itertools

CONSONANTS = 'bcdfghjklmnpqrstvwxz'
VOWELS = 'aeiou'


def product(a, b, repeat):
    if repeat % 2 == 0:
        for ret in itertools.product(a, b, repeat=repeat//2):
            yield ret
    else:
        for ret in itertools.product(b, a, repeat=repeat//2+1):
            if ret[0] != b[0]:
                break
            yield ret[1:]


def generate_answers(n):
    return itertools.chain(product(CONSONANTS, VOWELS, repeat=n),
                           product(VOWELS, CONSONANTS, repeat=n))


if __name__ == '__main__':
    for answer in generate_answers(int(raw_input().strip())):
        print(''.join(answer))