牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Rubyでどう書く?:連続した数列を範囲形式にまとめたいをPythonでやってみた

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")
結果
1-3.
1-3, 5, 7-8.
1, 3-5, 7.

コード長いかな(´・ω・`)
Rubyもいいなぁ...

いちおう関数の説明

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.