連続する数列をハイフンでまとめるシェルスクリプト – ザリガニが見ていた…。を見て、面白いことをやっているので 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を使うのほうがいいのかなあ。