文字列からの数値抜き出しとソート時のインデックス取得

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]  # もしソートしたリストも欲しいなら