Ruby の配列(Array)には each_slice というメソッドがある。配列のスライスを順に返してくれるイテレータだ。こんなふう。
irb(main):001:0> [0,1,2,3,4,5].each_slice(2){|x| p x} [0, 1] [2, 3] [4, 5] => nil
昨日、CodeEval の問題を解くのに、この Array#each_slice が使えると思っていつもの Python じゃなくて Ruby で解いたんだけど、Python には Ruby の Array#each_slice に相当するものがないみたい。
で、今日になってジェネレータを使えばいいんじゃないかと気が付いたので、書いてみた。
def each_slice(lis, n): s = 0 while s < len(lis): yield lis[s:s+n] s += n for x in each_slice([0,1,2,3,4,5], 2): print x
^o^ >python each_slice.py [0, 1] [2, 3] [4, 5]
上の例では、要素数がちょうど割り切れる数だったけど、半端が出る場合はどうだろう。Ruby だとこうなる。
irb(main):002:0> [0,1,2,3,4,5,6].each_slice(2){|x| p x} [0, 1] [2, 3] [4, 5] [6] => nil
Python で書いたスクリプトだと:
^o^ > python each_slice.py [0, 1] [2, 3] [4, 5] [6]
IndexError になるかと思ったけど、期待通りに動いた。