python——体育收入排行2012-2019

体育收入排行2012-2019

描述

附件中文件为2012-2019年世界运动员收入排行榜

文件内容及格式如下图所示:

题目要处理的文件内容示意
其中pay是该运动员当年度的收入综合,salary是工资收入,endorsement是广告和其他收入。(pay = salary + endorsement)

请分析文件并读取数据,完成以下功能:

  1. 某年的收入排名前若干名选手
    如果输入 n 是 2012-2019 之间的年份,则可以输入整数 k,输出 n 年的前 k 名排名信息。如果 k 大于当年排名运动员人数,则输出当年所有的信息。每行一名运动员信息,以 | 间隔该行各项信息。
  2. 某年属于某个运动项目的所有运动员信息,和收入总和
    如果输入的是 sport(不区分大小写),则可以继续输入一个年份 201*,输出一个当年排行中的运动项目菜单,按照字符串升序排列,格式见示例,再输入运动项目对应的数字来输出该项运动当年的运动员数据,每行一名运动员信息,以 | 间隔该行各项信息。最后输出该项运动 n 年的表中收入总和,格式为 TOTAL: ${:.2f} M
  3. 如果输入不是年份或者 sport(不区分大小写),输出 Wrong Input

本题只保证测试用例中的年份均可以找到对应数据。
针对本文件,同学们也可以讨论和思考下,还可以做出哪些方面的数据统计。

示例 1

输入:

2020

输出:

Wrong Input

示例 2

输入:

SPORT
2019
9

输出:

1: Auto Racing
2: Baseball
3: Basketball
4: Boxing
5: Cricket
6: Football
7: Golf
8: Mixed Martial Arts
9: Soccer
10: Tennis
9     #输入:再输入运动项目对应的数字9后的输出
1 | Lionel Messi | $127 M | $92 M | $35 M | Soccer | 2019
2 | Cristiano Ronaldo | $109 M | $65 M | $44 M | Soccer | 2019
3 | Neymar | $105 M | $75 M | $30 M | Soccer | 2019
44 | Paul Pogba | $33 M | $29 M | $4 M | Soccer | 2019
46 | Andres Iniesta | $32.5 M | $30 M | $2.5 M | Soccer | 2019
53 | Alexis Sánchez | $30.8 M | $28.3 M | $2.5 M | Soccer | 2019
55 | Kylian Mbappe | $30.6 M | $26.6 M | $4 M | Soccer | 2019
57 | Mesut Ozil | $30.2 M | $23.7 M | $6.5 M | Soccer | 2019
66 | Oscar | $29 M | $27 M | $2 M | Soccer | 2019
75 | Antoine Griezmann | $27.7 M | $23.2 M | $4.5 M | Soccer | 2019
79 | Gareth Bale | $27.1 M | $20.6 M | $6.5 M | Soccer | 2019
98 | Mohamed Salah | $25.1 M | $16.1 M | $9 M | Soccer | 2019
TOTAL: $607.00 M

示例 3

输入:

2019
5

输出:

1 | Lionel Messi | $127 M | $92 M | $35 M | Soccer | 2019
2 | Cristiano Ronaldo | $109 M | $65 M | $44 M | Soccer | 2019
3 | Neymar | $105 M | $75 M | $30 M | Soccer | 2019
4 | Canelo Alvarez | $94 M | $92 M | $2 M | Boxing | 2019
5 | Roger Federer | $93.4 M | $7.4 M | $86 M | Tennis | 2019

参考代码

#fopen()读取文件做二维列表l,格式为:

#[['Rank', 'Name', 'Pay', 'Salary/Winnings', 'Endorsements', 'Sport', 'Year'],

# ['1', 'Lionel Messi', '$127 M', '$92 M', '$35 M', 'Soccer', '2019']

# ['2', 'Cristiano Ronaldo', '$109 M', '$65 M', '$44 M', 'Soccer', '2019'], ...]

def fopen():
    l=[]
    with open('2012-19sport.csv','r',encoding='UTF-8') as f:
        for i in f.readlines():
            l.append(i.strip().split(','))

    for i in l:
        i[0]=i[0].strip('#')
    return l

#sportclass()获得排行中所有的运动类别,返回排序列表
def sportclass(lt):
    s=set()
    for i in lt[1:]:
        s.add(i[-2])
    return sorted(s)


lt=fopen()
c=input()  #输入选项

if c.isdigit() and 2012<=eval(c)<=2019: #如果输入的是年份,继续输入需要显示的n名运动员
    n=int(input())
    if n>100:    #如果超过100,输出所有当年信息
        n=100
    ln=[]
    for i in lt[1:]:
        if i[-1]==c:
            ln.append(i)
    for i in ln[:n]:
        print(' | '.join(i))
elif c.lower()=='sport':  #如果输入sport, 输出所有运动选项并编号,并统计n年的该运动板块总收入
    d={}   #字典存放键值对,选项:运动类别
    n = input()  # 年份
    ln=[]
    for i in lt[1:]:
        if i[-1] == n:
            ln.append(i)
    lsc=sportclass(ln)
    for i,j in enumerate(lsc):
        print('{}: {}'.format(i+1,j))
        d[i+1]=j
    k=input()   #输入运动选项
    s=0
    for i in lt[1:]:
        if i[-1]==n and i[-2]==d[int(k)]:
            print(' | '.join(i))
            s+=eval(i[2][1:-1])
    print('TOTAL: ${:.2f} M'.format(s))
else:
    print('Wrong Input')

本人写的代码:

with open('2012-19sport.csv', 'r', encoding='utf-8') as f:
    data = [p.strip().split(',') for p in f.readlines()]
    for i in data:
        i[0] = i[0].strip('#')

n = input()
if n.isdigit() and 2012 <= int(n) <= 2019:
    data = [p for p in data if p[-1] == n]
    k = int(input())
    if k > len(data):
        k = len(data)
    for person in data[:k]:
        print('{} | {} | {} | {} | {} | {} | {}'.format(person[0], person[1], person[2], person[3], person[4], person[5], person[6]))
elif n.lower() == 'sport':
    year = input()
    race = list(set([person[-2] for person in data if person[-1] == year]))
    race.sort()
    race = dict(zip([i for i in range(1, len(race)+1)], race))
    for key, value in race.items():
        print('{}: {}'.format(key, value))
    num = int(input())
    data = [person for person in data if person[-1] == year and person[-2] == race.get(num)]
    tot = 0
    for person in data:
        print('{} | {} | {} | {} | {} | {} | {}'.format(person[0], person[1], person[2], person[3], person[4], person[5], person[6]))
        tot += eval(person[2].split()[0].split('$')[1])
    print('TOTAL: ${:.2f} M'.format(tot))
else:
    print('Wrong Input')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_62488776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值