2016-05-10 20 views
1

私は現在、ゲームをプレイしたときに得た人名とスコアを持つファイルにいくつかのデータを保存しています。Python名前とスコアのファイルを並べ替える

ファイル内のデータが次のようになります。

with open("Scores.txt","r") as f: 
    lines = sorted(f.readlines()) 
    print lines 

しかし、単に自分の名前のそれぞれの最初の文字によってそれらをソートしている:

Reece 0 
John 5 
Alex 2 

私はこのようなものを使用して試してみました。

は私の出力は次のようにする必要があります:

Reece 0 
Alex 2 
John 5 

それは比較的単純なプログラムがあると私はすべてのヘルプは素晴らしいだろうPythonの2.7

使用しています、私はまた、私のプログラム上の任意の情報を提供することができます!

+2

? –

答えて

0

sortedの呼び出すためにcmpのparamを追加します。

with open("test.txt","r") as f: 
    comparator = (lambda x,y: cmp(int(x.split(' ')[-1]), int(y.split(' ')[-1]))) 
    lines = sorted(f.readlines(), cmp=comparator) 
    print lines 
+0

これで何も並べ替えられなかった – Reece

+0

@Reece updated answer、good luck)! –

2

キーはそうのように動作します:あなたが唯一の1のリストを作成し、あなたのようにしているよう

with open("test.txt","r") as f: 
    lines = sorted(iter(f), key=lambda x: int(x.partition(" ")[-1])) 
    print lines 

それはメモリ効率的になりますファイルの行を1回だけ反復すると、かなり速くなります。

全体として、私はそれが最も速く効率的な方法だと考えています。

出力を含むすべての機能は、したがって、このようになります:ので、あなたは数(0、2、5)で、あなたの行をソートする必要が

with open("test.txt","r+") as f: 
    lines = sorted(iter(f), key=lambda x: int(x.partition(" ")[-1])) 
    f.seek(0) 
    f.truncate() 
    [f.write(l if l.endswith("\n") else l + "\n") for l in lines] 
+0

明確にするために、このコードはファイル内の各行(** iter(f)**)を調べ、_sorted()_関数にラムダ(匿名)関数に基づいてソートするように指示します(**ラムダx:int(x.partition( "")[ - 1])**)各行のスコアを行の名前から分割して得ます(** x.partition( "")[ - 1] * *)。これにより、スコアでソートされたファイルの行のリストが_lines_変数に格納され、最後に出力されます。 – Mark

+0

_sorted()_関数に** iter(f)**が必要であるとは思っていませんが、_sorted()_関数は最初の引数としてiterableを受け入れるので** f **を使うことができます。ファイル(f)は – Mark

+1

@マークあなたは正しいです、私は 'iter()'を明確にするために使用しました。オーバヘッドはまったく発生しません。 – Bharel

関連する問題