def look_and_say_numbers():
""" Generate the look-and-say number sequence.
Start from
'1', which we say 'one one', giving
'11', which we say 'two ones', giving
'21', which we say 'one two, one one', giving
'1211' etc.
>>> g = look_and_say_numbers()
>>> g.next(), g.next(), g.next(), g.next()
('1', '11', '21', '1211')
"""
from itertools import groupby
def group_length(gp):
" Return the length of an iterable returned by groupby. "
return sum(1 for _ in gp)
look_say_number = "1"
while True:
yield look_say_number
look_say_number = "".join([
"%d%s" % (group_length(group), digit)
for digit, group in groupby(look_say_number)])
if __name__ == "__main__":
import doctest
doctest.testmod()
from itertools import islice
for look_say_number in islice(look_and_say_numbers(), 10):
print look_say_number