遅延リストを使った解
from itertools import imap, izip, cycle fizz = cycle(['','','Fizz']) buzz = cycle(['','','','','Buzz']) for num,text in izip(xrange(1,101), imap(''.join,izip(fizz,buzz))): print text or num
- xrange ... xrange(1,101) 1から100までの数値範囲の遅延リスト
- cycle ... 無限リストを生成。
- izip ... 複数のリストから要素のペアのリストを生成。(組み込み関数zipの遅延評価版)
- imap ... リストの各要素を関数で評価した結果のリストを返す。(組み込み関数mapの遅延評価版)
- ''.join ... 文字列を結合する関数。(string.joinだと空白が入る為、str.__add__でも可)
追記:
fizz,buzzの要素を毎回結合するよりも、
予めfizzとbuzzの各要素を結合したものをcycleで無限リストにする方が効率良い。
zip関数の生成する結果のリストは短い方のリストに長さが揃えられる点に注意。
無限リストのスライス作成にはitertoolsのislice関数を使う。
fizzbuzz = cycle(islice(imap(''.join,izip(fizz,buzz)),15))
-
-
- -
-
いろんな言語での回答
http://programming.reddit.com/info/10d7w/comments