两项竞赛总分

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 27 19:42:56 2019

@author: 巧若拙
某学校使用“两项竞赛”对各班级的日常表现进行评比,规则如下:
记录各个班级的纪律和卫生得分,根据得分分别计算纪律和卫生名次
(得分越高排名越前,得分相同,名次也相同);
再根据两项竞赛的名次计算总分(总分=纪律名次+卫生名次);
最后计算总分的名次(总分越低排名越前,得分相同,名次相同)。
现用程序实现上述功能:程序加载时,自动从数据库读取并显示各班的纪律和卫生得分,
输入授奖班级数c,分别输出纪律、卫生、总分前c名的班级编号。
"""
def rank(a):#计算各班单项或总分的名次a[i][1]
    a[0][1] = 1
    for i in range(1, len(a)):
        if a[i][0] == a[i-1][0]:
            a[i][1] = a[i-1][1]
        else:
            a[i][1] = i + 1
            
def print_info(a, c, name):#输出单项或总分前c名
    print(f'{name}前{c}名:', end=' ')
    for i in range(n):
        if a[i][1] > c:
            break
        print(a[i][2], end=' ')
    print()
     
n = 9
discipline = (45, 20, 31, 42, 15, 23, 30, 47, 45)
clean = (47, 43, 42, 13, 12, 59, 30, 14, 49)
print(f'班级 纪律 卫生')
for i in range(n):
    print(f'{bj[i]:3.0f}  {discipline[i]:3.0f}  {clean[i]:3.0f}')
#分别对纪律和卫生得分按降序排序,若得分相同,则按班级编号升序排序
discipline = [[v, 0, i] for i, v in enumerate(discipline, start=1)]
discipline.sort(key=lambda x:(-x[0], x[2]))
clean = [[v, 0, i] for i, v in enumerate(clean, start=1)]
clean.sort(key=lambda x:(-x[0], x[2]))
#分别计算各班的纪律和卫生排名
rank(discipline)
rank(clean)
print(discipline)
print(clean)

#因为班级编号为[1,n],故设置数组total长度为n+1
total = [[0, 0, i] for i in range(n+1)]
for i in range(n):#计算各班的总分
    total[discipline[i][2]][0] += discipline[i][1]
    total[clean[i][2]][0] += clean[i][1]
#计算各班的总分排名,注意要删除元素total[0]
total = sorted(total[1:], key=lambda x:(x[0], x[2]))
rank(total)
print(total)
#依次输出单项和总分前c名
c = int(input('请输入授奖班级数:'))
while c != 0:
    print_info(discipline, c, '纪律')
    print_info(clean, c, '卫生')
    print_info(total, c, '总分')
    c = int(input('请输入授奖班级数:'))

你可能感兴趣的:(python,Python练习实例,模拟过程,排序)