如何修改代码以调整结果格式?
在下面的Python代码中(这个函数应该能够接收随机信息,并返回平均成绩最高的人的名字和平均时间):
def the_fastest(times):
fastest_person = []
quickest_time = float('inf')
for person_data in times:
person_name = person_data[0]
person_times = person_data[1:]
total_time = sum(person_times)
avg_time = total_time / len(person_times)
if avg_time < quickest_time:
quickest_time = avg_time
fastest_person = [person_name]
elif avg_time == quickest_time:
fastest_person.append(person_name)
return fastest_person, round(quickest_time, 2)
#example times for testing
times = [['Jason', 11, 11, 11.2, 10.9], ['Wally', 11, 11.5], ['Sheri', 12, 25], ['Jimmy', 10.1, 10.8, 12.1], ['Tina', 10.15, 10.223, 10.185, 10.22], ['Carmen', 12.15, 12.2, 12.18, 12.33]]
print(the_fastest(times))
我的结果虽然返回了正确的信息,但格式不对。我得到的是:(['Tina'], 10.19)
但我希望它的格式是:['Tina', 10.19]
。
我试过一种简单粗暴的方法,就是直接让它 print(f"['{name}',{time}]")
,这样是可以的,但我想要一种更优雅的方式。
2 个回答
0
如果你想要获取列表 fastest_person
中的所有元素(即使有多人并列最快),你可以使用 *
操作符,把这个列表里的元素展开到另一个列表里,而不是把它们放在一个嵌套的列表中:
return [*fastest_person, round(quickest_time, 2)]
但是如果你只想要每次得到一个名字,那你可能就不想把所有的最大名字放在一个列表里。下面是一个例子,展示如何用很少的代码,通过内置的 max
函数来实现这个功能(还借助了一些内置的 operator
和 statistics
模块):
from operator import itemgetter
from statistics import mean
def the_fastest(all_person_times):
name, mean_time = max((
[name, mean(times)]
for name, *times in all_person_times
), key=itemgetter(1) # get the max time from [name, time]
)
return [name, round(mean_time, 2)]
times = [['Jason', 11, 11, 11.2, 10.9], ['Wally', 11, 11.5], ['Sheri', 12, 25], ['Jimmy', 10.1, 10.8, 12.1], ['Tina', 10.15, 10.223, 10.185, 10.22], ['Carmen', 12.15, 12.2, 12.18, 12.33]]
print(the_fastest(times)) # ['Sheri', 18.5]
0
你没有提到一个特殊情况,就是多个人的最快时间是一样的,所以我就不讨论这个了。你可以考虑一下评论里提到的处理方法。
def the_fastest(times):
# fastest_person = [] # <-- fastest_person isn't a list, it's just one person
fastest_person = None
quickest_time = float('inf')
for person_data in times:
person_name = person_data[0]
person_times = person_data[1:]
total_time = sum(person_times)
avg_time = total_time / len(person_times)
if avg_time < quickest_time:
quickest_time = avg_time
# fastest_person = [person_name] # <-- again, don't use a list for one person
fastest_person = person_name
elif avg_time == quickest_time:
fastest_person.append(person_name)
# return fastest_person, round(quickest_time, 2) # <-- this is where you create your return list
return [fastest_person, round(quickest_time, 2)]
#example times for testing
times = [['Jason', 11, 11, 11.2, 10.9], ['Wally', 11, 11.5], ['Sheri', 12, 25], ['Jimmy', 10.1, 10.8, 12.1], ['Tina', 10.15, 10.223, 10.185, 10.22], ['Carmen', 12.15, 12.2, 12.18, 12.33]]
print(the_fastest(times))