2015-10-22 14 views
5

Ho una funzione che apre un file chiamato "table1.txt" e restituisce i valori separati da virgola in un determinato formato.Python Ordinamento contenuto del file txt

La mia funzione è:

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

ho capito come formattare correttamente così per un "file table1.txt di:

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 

Sarebbe uscita:

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 

Sto cercando di capire come ordinare il file in modo che la squadra con i punti più alti sia classificata al numero 1, e se una squadra ha punti uguali quindi sono classificati in base al diff (la differenza negli obiettivi a favore e contro la squadra), e se il differenziale è lo stesso sono classificati in base ai goal segnati.

ho pensato di attuare una funzione bubble sort simile a:

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 

Ma non so come isolare ogni linea e confronta i valori di ciascuno per l'un l'altro per ordinare.

+1

Per inciso, si può solo fare 'contenuti = [line.strip() diviso (',') per la riga in f] 'e rimuove la riga' line = [el.replace ... ' – TigerhawkT3

risposta

2

Il seguente codice ordinare l'elenco nei modi che hai chiesto:

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] 

Quello che fa diferently: Prima di tutto, converte tutti i dati relativi a ogni squadra di numeri, escluso il nome. Questo permette al codice successivo di fare matematica su di loro. Quindi la prima dichiarazione contents.sort ordina la lista per goal segnati (indice 2). operator.itemgetter(2) è solo un modo più veloce per dire lambda l:l[2]. La successiva dichiarazione contents.sortstabilmente ordina la lista in base agli obiettivi meno contro, in quanto è ciò che fa la lambda. L'ordinamento stabile significa che l'ordine di elementi ugualmente compiacenti non cambia, quindi le squadre con uguale obiettivo diff rimangono ordinate per goal segnati. La terza istruzione contents.sort esegue lo stesso ordinamento stabile per punti.

+0

Quindi questo produrrebbe un elenco di liste giusto? Quindi dovrei modificare molto il mio codice di formato, credo? Devo anche impostare reverse su true per ordinarlo in modo opposto? – Newbie

+0

@Newbie No. Il mio codice non modifica il formato dell'array di contenuti se non convertendo le stringhe in numeri interi e cambiando l'ordine – ppperry

+0

Oh ok. C'è un modo semplice per invertire i risultati della tua funzione?Al momento sta mettendo la squadra peggiore prima. O devo aggiungere un nuovo elenco dalla fine dell'elenco per iniziare? – Newbie

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

in modo che le righe assomigliano:

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

Quindi è possibile utilizzare la funzione di Python incorporata scegli:

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

e stampare 'tavolo' con la formattazione specifico che si desidera .

+0

Dovrebbe essere 'ordinato (contenuto ...'. – TigerhawkT3

+0

Questo non ordina nei modi che l'OP ha chiesto.Elimina la differenza tra gli obiettivi e gli obiettivi contro – ppperry

+0

Ogni riga sembra già il tuo esempio "formattato" – ppperry

1

Ho aderito spazi nella prima colonna con _ per rendere la vita più facile, quindi i dati si presenta come:.

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'] 
Problemi correlati