2012年1月5日木曜日

[python] 配列の隣接する2項にそれぞれ演算を施す

Twitter 経由でお題が流れてきました。オリジナルは
で紹介されているのですが
配列の隣接する2項にそれぞれ演算を施した配列を得たい。つまり、
f (+) [1,2,3,4,5] = [3,5,7,9]
のような f が欲しい。
というお題です。 perl や javascript では
や、python では
というエントリがすでに上がっていますが、 python の場合よく考えたら一番短い入力で止まるイテレータである itertools.imap() を使わなくても入力リストは引数で与えられているわけですから、本質的には

def mapBetween( list, func ):
    return map( func, list[:-1], list[1:] )

ということになるのではないでしょうか。この辺の処理を非常に強力に記述できるのは python の特徴であるかと思いますが、ここまでくると、ほぼ標準装備といっていいような気がします。

あとは形ばかりのエラー処理(ひどい)なんかを入れて

#! /usr/bin/env python
# -*- coding: utf8 -*-

import operator

def mapBetween( list, func ):
    try:
        return map( func, list[:-1], list[1:] )
    except:
        # Todo: Implement error handling
        return []

def main():
    a = [1,2,3,4,5]
    print a
    print mapBetween( a, operator.add )
    print mapBetween( a, operator.sub )
    print mapBetween( a, operator.mul )
    print mapBetween( a, operator.div )
    print mapBetween( a, lambda x,y: y%x )

if __name__ == '__main__':
    main()

と書くと良いような気がします。実行結果は

[1, 2, 3, 4, 5]
[3, 5, 7, 9]
[-1, -1, -1, -1]
[2, 6, 12, 20]
[0, 0, 0, 0]
[0, 1, 1, 1]

となります。

世の中には色々なプログラミング言語がありますが、適材適所で便利なものを選びたいですね。