done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

某スキル評価サービスに解答するためのプログラム(Python)

はっきり言ってあんまり汎用性はありませんが、某サービスの問題を解くために使ったプログラムの一部を紹介します。

問題を解く過程で、括弧を含む文字列をパースして、リスト型にするプログラムを考案しました。

例えば、

AAAA => ['A','A','A','A'] AB(CD) => ['A','A',['C','D']] A(BC)D(E(F)) => ['A',['B','C'],'D',['E',['F']]]

と言った風にリスト型にして返します。

以下がそのコードです。

[python] def parseString(string, level = 0): chunk = [] i = 0 flag = 0 string = list(string) for j, c in enumerate(string): if c == "(": flag += 1 i += 1 elif c == ")": i -= 1 if i == level: print "test" if len(string[:j]) != 0: chunk.append(parseString(string[:j], level + 1)) if len(string[j + 1:]) != 0: for token in parseString(string[j + 1:], level): chunk.append(token) return chunk else: if i == level: chunk.append(c) return chunk [/python]

まずは入力されたstringをlist()によって一文字ごとに分割したリスト型に変換しています。

一文字ずつ処理していき、"("にあたったときはそれに対応する")"がある場所までリストを走査し、")"がある部分で2分割して再帰するのがミソです。

ネストが深くなってしまいリーダブルなコードとは言えないので、もっとスマートに再帰が使えるようになりたいですね。

map関数やらジェネレータやらも使ってみたい……