『Rubyでどう書く?:連続した数列を範囲形式にまとめたい - builder by ZDNet Japan』をPythonでやってみた。
- スペースで区切った数値の文字列を連続している場合のみハイフンで繋ぐ。例:"1 2 3 5 7 8" が "1-3, 5, 7-8." に。(仕様の詳細はリンク先で)
def str_to_sequence(s): num_li = map(int, s.split(" ")) div_li = [[num_li[0]]] for num in num_li[1:]: if div_li[-1][-1] + 1 == num: div_li[-1].append(num) else: div_li.append([num]) return div_li def shape(seq): r_li = [] for g in seq: if len(g) >= 2: r_li.append("%d-%d" % (g[0], g[-1])) else: r_li.append(str(g[0])) return ", ".join(r_li) + "." def p_shape_str(s): print shape(str_to_sequence(s)) p_shape_str("1 2 3") p_shape_str("1 2 3 5 7 8") p_shape_str("1 3 4 5 7")
いちおう関数の説明
str_to_sequence()で、文字列を範囲ごとにまとめてリスト化。
shape()で、そのリストを成形。
p_shape_str()は、上記二つの関数の処理をまとめて結果表示。
#例 >>> s = "1 2 3 5 7 8" >>> str_to_sequence(s) [[1, 2, 3], [5], [7, 8]] >>> shape([[1, 2, 3], [5], [7, 8]]) '1-3, 5, 7-8.' >>> p_shape_str(s) 1-3, 5, 7-8.