2015-10-22 3 views
5

У меня есть функция, которая открывает файл с именем: table1.txt и выводит значения, разделенные запятыми, в определенный формат.Python Сортировка содержимого txt-файла

Моя функция:

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 

Я пытаюсь выяснить, как сортировать файл, чтобы команда с наивысшими точками заняла первое место, а если команда имеет равные очки, тогда они ранжируются по разности (разница в целях за и против команды), и если разность одинакова, они оцениваются по забитым голам.

Я думал о реализации функции пузырьковой сортировки, аналогичной:

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

Как и в сторону, вы можете просто сделать 'содержание = [line.strip() дробление (',') для строки в 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 оператор стабильно сортирует список по воротам за минусом гола против, так как это делает лямбда. Стабильная сортировка означает, что порядок одинаково составляющих элементов не изменяется, поэтому команды с равным выбором цели остаются отсортированными по забитым голам. Третий оператор contents.sort делает тот же стабильный сортимент по точкам.

+0

Итак, это приведет к вывозу списка списков? Так что мне нужно было бы изменить свой формат кода, я думаю? Также я просто устанавливаю обратное значение в true, чтобы отсортировать его в обратном направлении? – Newbie

+0

@Newbie № мой код не изменяет формат массива содержимого, кроме как преобразование строк в целые числа и изменение порядка – ppperry

+0

О, хорошо. Есть ли простой способ обратить вспять результаты вашей функции?На данный момент он ставит худшую команду в первую очередь. Или мне нужно добавить в новый список из конца списка? – Newbie

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

так, что ваши строки выглядеть следующим образом:

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

Затем вы можете использовать встроенную функцию Питона сортировки:

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

и печать «таблица» с определенным форматированием вы хотите ,

+0

Должно быть 'sorted (contents ...'. – TigerhawkT3

+0

Это не сортирует способы, которые задавал OP. Он исключил разницу между целями и целями. – ppperry

+0

Каждая строка уже выглядит как ваш «форматированный» пример. – ppperry

1

Я присоединился пробелы в первой колонке с _, чтобы сделать жизнь проще, поэтому данные выглядит следующим образом:.

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'] 
Смежные вопросы