John Salerno wrote: > Ben Cartwright wrote: > >> Definitely go for (1). The Morris sequence is a great candidate to >> implement as a generator. As a generator, it will be more flexible and >> efficient than (2). > > Actually I was just thinking about this and it seems like, at least for > my purpose (to simply return a list of numbers), I don't need a > generator. My understanding of a generator is that you do something to > each yielded value before returning to the generator (so that you might > not return at all), but since I'm not handling the individual numbers, > just getting a list, it seems I don't need them to be yielded. Of > course, a generator would allow the process to be done over and over, I > suppose, which is what I wanted, I just couldn't figure out how to keep > using the new values.
itertools.groupby makes this very straightforward: >>> from itertools import groupby ... >>> def lookandsay(seed): ... seed = str(seed) ... while 1: ... seed = "".join("%s%s" % (len(list(group)), item) ... for item, group in groupby(seed)) ... yield seed ... >>> >>> seq = lookandsay(1) >>> seq.next() '11' >>> seq.next() '21' >>> seq.next() '1211' >>> seq.next() '111221' >>> seq.next() '312211' If you want to get just part of the infinite series, use itertools.islice: >>> from itertools import islice >>> list(islice(lookandsay(1),10)) ['11', '21', '1211', '111221', '312211', '13112221', '1113213211', '31131211131221', '13211311123113112211', '11131221133112132113212221'] >>> list(islice(lookandsay(1),10,20)) ['3113112221232112111312211312113211', '1321132132111213122112311311222113111221131221', '11131221131211131231121113112221121321132132211331222113112211', '311311222113111231131112132112311321322112111312211312111322212311322113212221', '132113213221133112132113311211131221121321131211132221123113112221131112311332111213211322211312113211', '11131221131211132221232112111312212321123113112221121113122113111231133221121321132132211331121321231231121113122113322113111221131221', '31131122211311123113321112131221123113112211121312211213211321322112311311222113311213212322211211131221131211132221232112111312111213111213211231131122212322211331222113112211', '1321132132211331121321231231121113112221121321132122311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112311332111213122112311311123112111331121113122112132113213211121332212311322113212221', '11131221131211132221232112111312111213111213211231132132211211131221131211221321123113213221123113112221131112311332211211131221131211132211121312211231131112311211232221121321132132211331121321231231121113112221121321133112132112312321123113112221121113122113121113123112112322111213211322211312113211', '311311222113111231133211121312211231131112311211133112111312211213211312111322211231131122211311122122111312211213211312111322211213211321322113311213212322211231131122211311123113223112111311222112132113311213211221121332211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221131112311311121321122112132231121113122113322113111221131221'] >>> HTH Michael -- http://mail.python.org/mailman/listinfo/python-list