体育收入排行2012-2019
描述
附件中文件为2012-2019年世界运动员收入排行榜
文件内容及格式如下图所示:

其中pay是该运动员当年度的收入综合,salary是工资收入,endorsement是广告和其他收入。(pay = salary + endorsement)
请分析文件并读取数据,完成以下功能:
- 某年的收入排名前若干名选手
如果输入n是 2012-2019 之间的年份,则可以输入整数k,输出n年的前k名排名信息。如果k大于当年排名运动员人数,则输出当年所有的信息。每行一名运动员信息,以|间隔该行各项信息。 - 某年属于某个运动项目的所有运动员信息,和收入总和
如果输入的是sport(不区分大小写),则可以继续输入一个年份201*,输出一个当年排行中的运动项目菜单,按照字符串升序排列,格式见示例,再输入运动项目对应的数字来输出该项运动当年的运动员数据,每行一名运动员信息,以|间隔该行各项信息。最后输出该项运动n年的表中收入总和,格式为TOTAL: ${:.2f} M - 如果输入不是年份或者
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')

6万+

被折叠的 条评论
为什么被折叠?



