2015-10-22 12 views
5

Ich habe eine Funktion, die eine Datei namens "table1.txt" öffnet und die kommagetrennten Werte in ein bestimmtes Format ausgibt.Python Sortierung Inhalt der txt-Datei

Meine Funktion ist:

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

ich herausgefunden, wie es richtig zu formatieren, so für eine „table1.txt Datei:

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 

wäre es Ausgabe:

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 

Ich versuche herauszufinden, wie man die Datei sortiert, so dass das Team mit den höchsten Punkten die Nummer 1 und wenn ein Team ist hat gleiche Punkte, dann werden sie nach Diff (der Unterschied in den Zielen für und gegen die Mannschaft) eingestuft, und wenn der Unterschied gleich ist, werden sie nach erzielten Toren sortiert.

Ich dachte an eine Blase Sortierfunktion ähnlich der Implementierung:

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 

Aber ich weiß nicht, wie jede Zeile zu isolieren und vergleichen die Werte der jeweils miteinander zu sortieren.

+1

Als Nebenwirkung, können Sie einfach tun 'contents = [line.strip() split (',') für line in f] 'und entferne die Zeile 'line = [el.replace ...'. – TigerhawkT3

Antwort

2

Der folgende Code wird die Liste in der Art und Weise sortieren Sie gefragt:

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] 

Was das bedeutet Diferently: Zunächst einmal wandelt alle Daten über jedes Team Zahlen, ohne den Namen. Dies ermöglicht dem späteren Code, sie zu berechnen. Dann sortiert die erste contents.sort Anweisung die Liste nach erzielten Toren (Index 2). operator.itemgetter(2) ist nur ein schneller Weg zu sagen lambda l:l[2]. Die nächste contents.sort Anweisung stabil sortiert die Liste nach Zielen für minus Ziele, wie das ist, was das Lambda tut. Stabile Sortierung bedeutet, dass sich die Reihenfolge der gleichvergleichen Elemente nicht ändert, so dass Teams mit gleichem Zielunterschied nach erzielten Toren sortiert bleiben. Die dritte contents.sort-Anweisung macht dieselbe stabile Sortierung nach Punkten.

+0

Also würde dies eine Liste von Listen richtig ausgeben? Also würde ich meinen Formatcode viel ändern müssen, denke ich? Stellen Sie auch einfach umgekehrt, um es in umgekehrter Reihenfolge zu sortieren? – Newbie

+0

@Newbie Nein. Mein Code ändert nicht das Format des Inhaltsarrays, außer durch Konvertieren von Zeichenfolgen in ganze Zahlen und Ändern der Reihenfolge – ppperry

+0

Oh ok. Gibt es eine einfache Möglichkeit, die Ergebnisse Ihrer Funktion umzukehren?Im Moment ist es das schlechteste Team an erster Stelle. Oder muss ich in eine neue Liste am Ende der Liste anhängen? – Newbie

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

, so dass Ihre Zeilen wie folgt aussehen:

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

Dann können Sie Python-internen Sortierfunktion verwenden:

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

und print 'Tisch' mit dem spezifischen Formatierungen Sie wollen .

+0

Sollen sortiert werden (Inhalt ... '. – TigerhawkT3

+0

Dies sortiert nicht in die Wege, die das OP gefragt. Es ausgeschlossen die Differenz zwischen den Zielen für und Ziele gegen. – ppperry

+0

Jede Zeile sieht bereits wie Ihr" formatiert "Beispiel. – ppperry

1

ich habe sie Räume in der ersten Spalte mit _ um das Leben leichter zu machen, so dass die Daten wie folgt aussehen:.

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'] 
Verwandte Themen