2016-05-17 7 views
1

私はリーダーボードを作ろうとしています。ここ は私が持っているリストです。リストに整数を伴う文字列をソート

list=['rami4\n', 'kev13\n', 'demian6\n'] 

私のようなものを与える、最高の数から最小へ、あるいは最小の最高に、このリストをソートできるようにしたいと思います:

list=['kev13\n', 'demian6\n', 'rami4\n'] 

を私が試しましたre.findall('\d+', list[loop])[0]のようなものを使うことができましたが、私はそのリストからベストプレイヤーを得ることしかできませんでした。そこにあるように多くの選手のためのコードを繰り返すことを望んでいない、誰もアイデアを持っていますか?

答えて

3

実際にはreモジュールを使用する必要がありますが、メソッドのkeyパラメータも使用する必要があります。

reg = re.compile('\w*?(\d+)\\n') 
lst.sort(key=lambda s: int(reg.match(s).group(1))) 

それはあなたがあまりにも行ったように細かfindall()を使用して動作します。それは一度、すべてのではなく、リスト内の各要素に対して計算されるように、私は正規表現をcompile()

reg = re.compile('\d+') 
lst.sort(key=lambda s: int(reg.findall(s)[0])) 

注意。

+0

ありがとうございました。しかし、あなたが使用したコンパイルについてもう少し説明できますか? –

+0

@ArwanCredozいくつかの情報、[ここ](https://msdn.microsoft.com/library/8zbs0h2f%28v=vs.110%29.aspx)。要するに、Regexは最初に一連の命令に変換された文字列で、文字列にマッチするように適用されます。コンパイルは最初のステップを保存するので、同じ正規表現を複数の文字列に一致させる必要がある場合は速度を上げてください。実際には、Pythonが計算された正規表現を内部的にキャッシュしているので、それは本当に重要ではありません。しかし、私はこれを明示的に行うことがベストプラクティスだと思います。 – Delgan

1

私はオブジェクト指向プログラミングと__lt__特殊メソッドのオーバーライドに基づいてstrの他のソリューションを持っています。

標準出力に印刷
import re 

class SpecialString(str): 
    def __lt__(self, other): 
     pattern=re.compile(r"\d+") 
     return int(pattern.search(str(self)).group(0)) < int(pattern.search(str(other)).group(0)) 

if __name__ == "__main__": 
    listing = ['rami4\n', 'kev13\n', 'demian6\n'] 
    spe_list = [SpecialString(x) for x in listing] 
    spe_list.sort() 
    print(spe_list) 

['rami4\n', 'demian6\n', 'kev13\n'] 

この方法では、あなたはsort機能を書き換え、内蔵の(おそらく最適化された)ものを使用しないようにできます。あなたの文字列は "strクラスの特殊化"のように思えるかもしれませんので、すべてのプロパティを保持して比較マカニズムを書き直すので、継承のマカニズムは非常に適しています。

関連する問題