2016-05-16 8 views
-3

ここにテキストファイルが説明されています。Pythonのテキストファイルをソートしてキーの最高値と最低値を見つける方法は?

Frank,Jones,[email protected],0126497428, 2, 10, 0, 0, 
FName, LName, Email, Number, Division, Points, ..., ..., 

目的:コードは、区分底部と各部門の上位2つのスコアプレーヤー、-1または+1をとるべきです。低スコアなら+1、高得点なら-1。だから、ある部門に6人がいたら、2人は上がるだろう、2人は下がるだろうし、2人は同じ部門にとどまるだろう。

コードは、テキストファイル全体を、値[4]に依存せず除算として分類します。どのように私は目的を完了するのですか?

私のコード今のところ:

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') 

テキストファイル:

Frank,Jones,[email protected],0126497428, 2, 10, 0, 0, 
Liam,Blair,[email protected],01273846273, 2, 9, 0, 0, 
Iain,Wilkins,[email protected],01293847328, 2, 9, 0, 0, 
Pat,Phillips,[email protected],01283948392, 2, 10, 0, 0, 
Edward,Costello,[email protected],01475937837, 3, 8, 0, 0, 
John,Brown,[email protected],01283345539, 3, 4, 0, 0, 
Tim,Pratchett,[email protected],, 3, 12, 0, 0, 
Eleanor,House,[email protected],01274535823, 3, 12, 0, 0, 
Gregory,Davies,[email protected],, 4, 10, 0, 0, 
Tina,Turner,[email protected],01782519345, 4, 4, 0, 0, 
Sally,Stevens,[email protected],01245538432, 4, 3, 0, 0, 
John,Lennon,[email protected],01245934723, 4, 3, 0, 0, 

望ましい結果:

Frank, Jones, [email protected], 0126497428, 1,0,0,0, 
Liam, Blair, [email protected], 01273846273, 3,0,0,0, 
Iain, Wilkins, [email protected], 01293847328, 3,0,0,0, 
Pat, Phillips, [email protected], 01283948392, 1,0,0,0, 
Edward, Costello, [email protected], 01475937837, 4,0,0,0, 
John, Brown, [email protected], 01283345539, 4,0,0,0, 
Tim, Pratchett, [email protected],, 2,0,0,0, 
Eleanor, House, [email protected], 01274535823, 2,0,0,0, 
Gregory, Davies, [email protected],, 4,0,0,0, 
Tina, Turner, [email protected], 01782519345, 4,0,0,0, 
Sally, Stevens, [email protected], 01245538432, 5,0,0,0, 
John, Lennon, [email protected], 01245934723, 5,0,0,0, 

誰もがこれに対する答えを持っていますか?それは可能なのか?

+0

希望する出力の最後の2行目: '5,0,0、、'あなたは**に番号がないことを望みますか? –

+0

申し訳ありません、それはエラーでした。変更されました。ありがとう – Toby

+0

私が正しく理解していれば、Edward Costelloは4,0,0,0になります。 – polku

答えて

1

簡単に言えば、あなたはあなたがそう最初の1

を引く必要がある2つの最高値の一つとして、第六のフィールドを持っているものを除き、ファイル内のすべての行の5番目のフィールドに1を追加したいです実行する事は(2行を意味しますが、それはより多くのことができますが、2つの値を取る)あなたの方法が複雑と間違っている、これらの2つの値を知ることです、あなたはその後

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

を使用することができるだけの行

に繰り返します
for line in lines: 
    if line[4] in max_values: 
     line[5] -= 1 
    else: 
     line[5] += 1 

PS:csvファイルでたくさんの操作を行う場合、pandasライブラリを見る価値はあるかもしれませんが、すべての操作のためにデータを繰り返す必要はありません。

+0

私はこれを私のコードにどのように組み込むのか、それほど確かではありません。私は学生で、これはモジュールです。だから、私は3週間しか勉強していないので、私は非常にPythonに関する知識が限られています。時間があれば、コードで言いました内容を拡張することができます。あなたはすでに私に与えてくれてありがとう。 – Toby

+0

さて、あなたのコードはこうしています:1 - データをロードする、2-最大値を見つける、3 - 行を修正する、4 - ファイルを書き込む。あなたの2と3は間違っています。だから私はあなたに(うまくいけば)良いものを与えた。あなたがこのコードの作者であれば、あなたが保守したり交換しなければならないものを理解するのは難しいことではありません。 – polku

+0

私はこれまで何年もそれをやろうとしてきました。私はそれが働くようになったと思ったが、実際にはそれは実現しなかった。もう助けてくれませんか?さらに、あなたのコードでは、行[4]の場合は...行[5]と下の行が行[4]になるようにする必要があります。 – Toby

関連する問題