2015-10-22 12 views
5

"table1.txt"というファイルを開き、カンマ区切りの値を特定の形式に出力する関数があります。Pythonソートtxtファイルの内容

My機能は次のとおりです。

def sort_and_format(): 

    contents = [] 
    with open('table1.txt', 'r+') as f: 
     for line in f: 
      contents.append(line.split(',')) 

    max_name_length = max([len(line[0]) for line in contents]) 

    print("  Team      Points Diff Goals  \n") 
    print("--------------------------------------------------------------------------\n") 
    for i, line in enumerate(contents): 
     line = [el.replace('\n', '') for el in line] 
     print("{i:3} {0:{fill_width}} {1:3} {x:3} {2:3} :{3:3}".format(i=i+1, *line, 
     x = (int(line[2])- int(line[3])), fill_width=max_name_length)) 

私はの「table1.txtファイルのように、それを正しくフォーマットする方法を考え出し:

FC Ingolstadt 04, 13, 4, 6 
Hamburg, 9, 8, 10 
SV Darmstadt 98, 9, 8, 9 
Mainz, 9, 6, 9 
FC Augsburg, 4, 7, 12 
Werder Bremen, 6, 7, 12 
Borussia Moenchengladbach, 6, 9, 15 
Hoffenheim, 5, 8, 12 
VfB Stuttgart, 4, 9, 17 
Schalke 04, 16, 14, 3 
Hannover 96, 2, 6, 18 
Borrusia Dortmund, 16, 15, 4 
Bayern Munich, 18, 18, 2 
Bayer Leverkusen, 14, 11, 8 
Eintracht Frankfurt, 9, 13, 9 
Hertha BSC Berlin, 14, 5, 4 
1. FC Cologne, 13, 10, 10 
VfB Wolfsburg, 14, 10, 6 

それはなり出力:

Team        Points Diff Goals  

-------------------------------------------------------------------------- 

    1 FC Ingolstadt 04    13 -2 4 : 6 
    2 Hamburg      9  -2 8 : 10 
    3 SV Darmstadt 98    9  -1 8 : 9 
    4 Mainz      9  -3 6 : 9 
    5 FC Augsburg     4  -5 7 : 12 
    6 Werder Bremen    6  -5 7 : 12 
    7 Borussia Moenchengladbach 6  -6 9 : 15 
    8 Hoffenheim     5  -4 8 : 12 
    9 VfB Stuttgart    4  -8 9 : 17 
10 Schalke 04     16 11 14 : 3 
11 Hannover 96     2 -12 6 : 18 
12 Borrusia Dortmund   16 11 15 : 4 
13 Bayern Munich    18 16 18 : 2 
14 Bayer Leverkusen    14  3 11 : 8 
15 Eintracht Frankfurt   9  4 13 : 9 
16 Hertha BSC Berlin   14  1 5 : 4 
17 1. FC Cologne    13  0 10 : 10 
18 VfB Wolfsburg    14  4 10 : 6 

私はファイルをソートする方法を見つけようとしています。その結果、最高点のチームが1位にランク付けされ、チーム等しいポイントを持っている場合、それらはdiff(チームの間の、そしてチームとのゴールの違い)によってランク付けされ、diffが同じであれば、得点でランク付けされます。

私は次のようにバブルソート機能の実装を考えた:

def bubble_sort(lst): 
    j = len(lst) 
    made_swap = True 
    swaps = 0 
    while made_swap: 
     made_swap = False 
     for cnt in range (j-1): 
      if lst[cnt] < lst[cnt+1]: 
       lst[cnt], lst[cnt+1] = lst[cnt+1], lst[cnt] 
       made_swap = True 
       swaps = swaps + 1 
    return swaps 

をしかし、私は、各ラインを分離し、ソートするためにお互いにそれぞれの値を比較する方法がわかりません。

+1

スプリット( '、')for f] ''を削除し、 'line = [el.replace ...'行を削除します。 – TigerhawkT3

答えて

2

次のコードは、あなたが尋ねた方法でリストをソートします:

from operator import itemgetter 
def sort_and_format(): 
    contents = [] 
    with open('table1.txt', 'r+') as f: 
     for line in f: 
      l = line.split(',') 
      l[1:]=map(int,l[1:]) 
      contents.append(l) 
    contents.sort(key=itemgetter(2)) 
    contents.sort(key=lambda team:team[2]-team[3]) 
    contents.sort(key=itemgetter(1)) 
    [printing and formatting code] 

これはdiferently何:すべての まず、それは名前を除いて、数字に各チームについてのすべてのデータを変換します。これにより、後のコードで数学を行うことができます。 最初のcontents.sortステートメントは、得点(インデックス2)でリストをソートします。 operator.itemgetter(2)はちょうどlambda l:l[2]と言うより速い方法です。次のcontents.sortステートメント安定しては、ラムダがそうするように、マイナスの目標に対してリストをソートします。 安定したソートとは、均等な要素の順序がに変更されないことを意味します。したがって、同じ目標差を持つチームは、得点でソートされたままです。 3番目のcontents.sortステートメントは、ポイントごとに同じ安定した並べ替えを行います。

+0

これはリストのリストを出力するでしょうか?だから私は多くの私のフォーマットコードを変更する必要がありますか?逆にソートするには、逆にtrueに設定するだけですか? – Newbie

+0

@Newbieいいえ。私のコードは、文字列を整数に変換して注文を変更する以外のコンテンツ配列の形式を変更しません。 – ppperry

+0

大丈夫です。あなたの機能の結果を逆転させる簡単な方法はありますか?現時点では最悪のチームを先に進めています。または、リストの最後から新しいリストを追加する必要がありますか? – Newbie

2
contents = [row.strip('\n').split(', ') for row in open('table1.txt', 'r+')] 

ので、あなたの行は次のように見えること:あなたが欲しい特定の書式で

table = sorted(contents, key=lambda r: (int(r[1]), int(r[2])-int(r[3]), int(r[3])), reverse=True) 

と印刷「テーブル」:そして、あなたはPythonの組み込みのソート機能を使用することができます

['FC Ingolstadt 04', '13', '4', '6'] 

+0

'ソート済み(内容...)。 – TigerhawkT3

+0

これは、OPが尋ねたやり方でソートされません。 – ppperry

+0

各行は既にあなたの"書式化された "例のように見えます – ppperry

1

私は生活を楽にするために_との最初の列にスペースが参加しているので、データは次のようになります。あなたがコンテンツ= [line.strip() 'だけを行うことができ、余談として

F_ngolstad_4    13 -2  4:6 
    Hamburg      9 -2 8:10 
    S_armstad_8    9  -1  8:9 
    Mainz      9 -3 6:9 
    F_ugsburg     4  -5 7:12 
    Werde_remen    6  -5 7:12 
    Borussi_oenchengladbach 6  -6 9:15 
    Hoffenheim     5 -4 8:12 
    Vf_tuttgart    4  -8 9:17 
    Schalk_4     16 11 14:3 
    Hannove_6     2 -12 6:18 
    Borrusi_ortmund   16 11 15:4 
    Bayer_munich    18 16 18:2 
    Baye_everkusen    14  3 11:8 
    Eintrach_rankfurt   9  4 13:9 
    Herth_S_erlin   14  1  5:4 
    1._F_ologne    13  0 10:10 
    Vf_olfsburg    14  4 10:6 

all_lines = [] 
with open('data', 'r') as f: 
    for line in f: 
     li = line.split() 
     all_lines.append(li) 


l = sorted(all_lines,key=lambda x: (int(x[1]),int(x[2])),reverse=True) 
for el in l: 
    print(el) 

['Bayer_munich', '18', '16', '18:2'] 
['Schalk_4', '16', '11', '14:3'] 
['Borrusi_ortmund', '16', '11', '15:4'] 
['Vf_olfsburg', '14', '4', '10:6'] 
['Baye_everkusen', '14', '3', '11:8'] 
['Herth_S_erlin', '14', '1', '5:4'] 
['1._F_ologne', '13', '0', '10:10'] 
['F_ngolstad_4', '13', '-2', '4:6'] 
['Eintrach_rankfurt', '9', '4', '13:9'] 
['S_armstad_8', '9', '-1', '8:9'] 
['Hamburg', '9', '-2', '8:10'] 
['Mainz', '9', '-3', '6:9'] 
['Werde_remen', '6', '-5', '7:12'] 
['Borussi_oenchengladbach', '6', '-6', '9:15'] 
['Hoffenheim', '5', '-4', '8:12'] 
['F_ugsburg', '4', '-5', '7:12'] 
['Vf_tuttgart', '4', '-8', '9:17'] 
['Hannove_6', '2', '-12', '6:18'] 
関連する問題