【问题标题】:How to make this sorting faster?如何使这种排序更快?
【发布时间】:2022-11-25 11:05:28
【问题描述】:

任务:提交包含 sort_people(people) 函数的文件。它获取人员列表并返回经过排序的人员列表。主要按出生日期排序(从大到小),如果有匹配项则按姓氏排序(根据通常的 Python 字符串比较升序),最后按名字排序(也是升序)。如果任何两个人在所有三个特征上都匹配,则他们的相互顺序可以是任意的。

我使用 Python sort() 方法的关键函数解决了这个任务,但这不是最好的方法,因为由于时间限制我只得到 5/10 分。

问题:帮助我使这个算法更快。

我的代码:

def compare_people(p1, p2):
    date1 = datetime.strptime(p1.birth_date, '%d.%m.%Y')
    date2 = datetime.strptime(p2.birth_date, '%d.%m.%Y')

    if date1>date2:
        return 1
    elif date1<date2:
        return -1
    
    if p1.last_name > p2.last_name:
        return 1
    elif p1.last_name < p2.last_name:
        return -1
    
    if p1.first_name > p2.first_name:
        return 1
    elif p1.first_name < p2.first_name:
        return -1
    else:
        return 0

def sort_people(people):
    cmp1 = functools.cmp_to_key(compare_people)
    people.sort(key=cmp1)
    return people

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    元组(和列表)比较按顺序比较其项目,并返回第一个不相等成员的比较。因此,如果您构建一个提供一系列要按顺序比较的值的键,您可以获得与您的代码等效的代码:

    people.sort(key=lambda p: (
        datetime.strptime(p1.birth_date, '%d.%m.%Y'),
        p.last_name,
        p.first_name,
    ))
    

    这有几个优点:

    • cmp_to_key被多次调用; key 每个元素只调用一次
    • 元组的比较是用C语言实现的,所以会比你的@987654324快很多@
    • 简短易读

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2020-06-15
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多