繁体   English   中英

txt文件的Python排序内容

[英]Python Sorting Contents of txt file

我有一个函数来打开一个名为“ table1.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 

我试图弄清楚如何对文件进行排序,以使得分最高的团队排名第1,如果团队得分相等,则按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

但是我不知道如何隔离每一行,并将每一行的值相互比较以进行排序。

以下代码将按照您要求的方式对列表进行排序:

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]

这有什么不同:首先,它将有关每个团队的所有数据转换为数字(不包括姓名)。 这允许以后的代码对它们进行数学运算。 然后,第一个contents.sort语句按得分目标(索引2)对列表进行排序。 operator.itemgetter(2)只是表示lambda l:l[2]的较快方法。 接下来contents.sort语句排序稳定的目标,针对目标减去名单,因为这是拉姆达做什么。 稳定的排序意味着相等配对元素的顺序不会改变 ,因此具有相同目标差值的团队仍将按计分的目标进行排序。 第三个contents.sort语句按点进行相同的稳定排序。

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

这样您的行看起来像:

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

然后,您可以使用Python的内置排序功能:

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

并使用所需的特定格式打印“表格”。

为了使生活更轻松,我在第一列中添加了_空格,因此数据如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM