文字列からの数値抜き出しとソート時のインデックス取得
CodeWarsより。 わかりやすいように少し改題。また,CodeWarsはPython2で動いているので下記のコードは通らない。
問題 入力:数値を含む文字列の配列が与えられる。ただし,各文字列には1~9の数字が1つだけ入っており,文字列間に含まれる数値の重複はない。 例) sentence = ['hoge8hoge', 'aa2bed', '5foobar'] 出力:文字列に含まれる数値順にソートせよ。 例) sentence' = ['aa2bed', '5foobar', 'hoge8hoge']
練習になった点は,(1)文字列から数値部を抜き出すには?,(2)ソートした時に,そのインデックスは取得できる? (2)に関して,numpyだとargsortで簡単にできる。sortした時にそのargも返してくれれば良いけど,それは無いので,両方欲しいときはargsortをもとのnumpy配列にインデックスとして渡す。 matlabとかはmax演算の時にargmaxもくれるけど,その違いに似ている。でも,numpyもCとかに比べれば相当楽だ。Pythonは便利だなぁ。
文字列の抜き出し = re.subを使う。味噌はsubは抽出はできずに代替(substitute)するので,数値以外の部分を削る。
import re string = 'hoge3' re.sub(re.compile('\D'), '', string) # 配列に適用したいならmap map(lambda x: re.sub(re.compile('\D'), '', x), sentence)
imoprt numpy as np d = [1, 3, 5, 2] sorted_index = np.argsort(d) # [0, 3, 1, 2] sorted = np.array(d)[sorted_index] # もしソートしたリストも欲しいなら