連続する数列をハイフンでまとめるPythonスクリプト

連続する数列をハイフンでまとめるシェルスクリプト – ザリガニが見ていた…。を見て、面白いことをやっているので Python でやってみた。

 cf. Rubyでどう書く?:連続した数列を範囲形式にまとめたい – builder by ZDNet Japan (元記事)

def diff(a):
    return map(lambda x, y: x - y, a[1:], a[:-1])

def hyphenate_num(s):
    a = map(lambda x: int(x), s.split())
    d = diff(a)
    b = map(lambda x, y: (x, y), a, d)
    r = []
    flg = False
    for x in b:
        if x[1] > 1:
            r.append(str(x[0]))
            r.append(', ')
            flg = False
        elif x[1] == 1:
            if not flg:
                r.append(str(x[0]))
                r.append('-')
                flg = True
        else:
            r.append(str(x[0]))
    return ''.join(r)

if __name__ == '__main__':
    print hyphenate_num("1 2 3")
    print hyphenate_num("1 2 3 5 7 8")
    print hyphenate_num("1 3 4 5 7")

実行結果:

^o^ > python hyphenate_num.py
1-3
1-3, 5, 7-8
1, 3-5, 7

あんまりきれいなコードじゃないけどできた。やっぱりreduceを使うのほうがいいのかなあ。