2016-05-19 15 views
0

テキストファイルには、次のように説明しQ:テキストファイル内のキーの値を最大から最小の順に並べる方法は? (のpython 2.7.11)は

Joe,Bloggs,[email protected],01269512355, 1 , 20, 0, 0, 0 
fname, lname, email, number, ..., number i want to order ^, ...,...,.. 

テキストファイル:

Joe,Bloggs,[email protected],01269512355, 1,20, 0, 0, 0 
Sarah,Brown,[email protected],01866522555, 1,25, 0, 0, 0 
Andrew,Smith,[email protected],01899512785, 1,30, 0, 0, 0 
Ray,Charles,[email protected],01268712321, 1,3, 0, 0, 0 
Kevin,White,[email protected],01579122345, 1,0, 5, 0, 0 
Samantha,Collins,[email protected],04269916257, 1,0, 0, 0, 0 

目的を:私はその結果に基づいて、順番に鍵を置くことができるようにしたいです値[5]の。これは、私がトップ2のスコアリングと最低2つのスコアリングキーの値[4]を変更する必要があるので、値[4]を変更する方が簡単です。そのため、[4]最高の2値 - 1、最低のスコア値は、[4]のコードの後に​​+ 1

テキストファイルが実行された:私はこれまで持って

Andrew,Smith,[email protected],01899512785, 0,30, 0, 0, 0 
Sarah,Brown,[email protected],01866522555, 0,25, 0, 0, 0 
Joe,Bloggs,[email protected],01269512355, 1,20, 0, 0, 0 
Kevin,White,[email protected],01579122345, 1,5, 0, 0, 0 
Ray,Charles,[email protected],01268712321, 2,3, 0, 0, 0 
Samantha,Collins,[email protected],04269916257, 2,0, 0, 0, 0 

コード:

f = open("players.txt", "r" 
lines = [] 
for line in f.readlines(): 
     line = [x.strip() for x in line.split(',')] 
     line[4] = int(line[4]) 
     line[5] = int(line[5]) 
     lines.append(line) 
f.close() 

values = sorted(list(set([l[4] for l in lines])),reverse=True) 
max_values = (values[0], values[1]) 

for line in lines: 
     if line[5] in max_values: 
       line[4] += 1 
     else: 
       line[4] -= 1 

with open("players.txt", "w") as f: 
      for line in lines: 
       line = [str(x) for x in line] 
       f.write(', '.join(line) + '\n') 

これは私のコードであり、かなり複雑です。このエラーが発生するので、私が望むように動作していないようです。

max_values = (values[0], values[1]) 
IndexError: list index out of range 

私のコードを完全に書き直して、より良いものにしてください。私はコーディングに新しいので、ほとんどのことを行う知識はまだありません。

答えて

1

あなたの根本的な問題はすべてのl [4]値がであることです。あなたのソートの声明では、私はあなたが欲しいと思います[5]、そうですか?

このコードでは、すべての値が1です。これらの値からセットを作成すると、1つの要素しか残っていません。セットからリストを作成し、ソートすると、結果のリストには1つの要素しかありません。したがって、値[1]は範囲外です。

ソートキーを正しく取得するには、その行を変更してください。添え字ではなく、に注意してください。

values = sorted(list(set([l[5] for l in lines])),reverse=True) 

はまた、私はあなたが最小値に対する変更を誤って処理していると思います。あなたのコードは、トップ2の1つではないキーに1を加えますが、ボトム2だけを変更したいと言っています。これを試してみてください:

max_values = (values[0], values[1]) 
min_values = (values[-1], values[-2]) 

for line in lines: 
     if line[5] in min_values: 
       line[4] += 1 
     elif line[5] in max_values: 
       line[4] -= 1 
+0

あなたは分かりません。私はキーを値の大きいものから小さいものへと昇順に並べることを望んでいます[5]。私はそのリストのトップ2を、トップ2には値[4]を変更したい。 @プルーン – Toby

+0

私は理解しています。しかし、あなたのキーは**値[5] **にあります。 **ソートされた**ステートメントは** values [4] **からキーを集めます。 – Prune

+0

訂正していただきありがとうございます。今それはうまく動作します:) – Toby

2

あなたはあなたがすでにやっているリスト内のすべての行を読み取ることができoperator.itemgetter

from operator import itemgetter 
values = sorted(lines, key=itemgetter(4), reverse=True) 

で一定のparamに基づいて行を並べ替えることができます。

次いで更新されたリストをソートするために、コードの上に使用することができる[5]

[4]または値の値を更新するために、リスト内のすべての行を反復します。

リストを反復してファイルに書き出します。

+0

私はこれを自分のコードにどのように統合しますか?@wtpoo – Toby

+0

私は答えを更新しました! – wtpoo

関連する問題