如何修改代码以调整结果格式?

0 投票
2 回答
31 浏览
提问于 2025-04-14 18:07

在下面的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 函数来实现这个功能(还借助了一些内置的 operatorstatistics 模块):

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))

撰写回答