2016-08-24 34 views
6

このリストを数値で並べ替えるにはどうすればよいですか?正規表現は数字を削除する必要がありますか?これを行うにはもっとPythonの方法がありますか?次のように数値に基づいて混合文字列のリストをソート

to_sort 

['12-foo', 
'1-bar', 
'2-bar', 
'foo-11', 
'bar-3', 
'foo-4', 
'foobar-5', 
'6-foo', 
'7-bar'] 

所望の出力は、次のとおり

1-bar 
2-bar 
bar-3 
foo-4 
foobar-5 
6-foo 
7-bar 
foo-11 
12-foo 
+1

を使用したくない場合は、ほとんどの「Python的」な方法は明確なものです。常にPythonのやり方ですべてを試みるのではなく、読みやすさと良い方法にもっと集中してください。 – Maroun

+0

@idjaw私は 'key'で'ソート 'しようとしましたが、以下の答えが私の理解を助けました。 – ade1e

+0

@adele常にあなたの試みを投稿し、私たちは常にお互いの間違いから学びます。間違った試行は非常に役に立ちます。 – Maroun

答えて

10

一つの解決策は、次の正規表現抽出である:

sorted(l, key=lambda x: int(re.search('\d+', x).group(0))) 

>>> l 
['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar'] 
>>> sorted(l, key=lambda x: int(re.search('\d+', x).group(0))) 
['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo'] 

keyはに変換抽出桁(ありますint)を使用します。

4

あなたは私のために正規表現

>>> l = ['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar'] 

>>> sorted(l, key = lambda x: int(''.join(filter(str.isdigit, x)))) 

['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo'] 
+2

入力が長い場合は、両方の実装を実行し、どちらが高速かを確認してください。 'filter(std.isdigit、x)'は、長い(文字単位の)一時的なリストを作成します。 – pts

+0

本当に、このためのフィルタはおそらくgenexpよりも遅いでしょう。 –

+0

これは私の理解に役立ち、 'isdigit'の使い方が分かりましたので、答えをマークアップしました。ありがとう – ade1e

関連する問題