MST

星途 面试题库

面试题:Python中sorted对列表排序灵活性之深度定制

有一个自定义类`MyClass`,类中有属性`value1`和`value2`。创建一个包含多个`MyClass`实例的列表,使用`sorted`函数对该列表进行排序,要求排序规则为:先按`value1`的平方与`value2`的立方之和从大到小排序,若此和相同,则按`value1`的绝对值从小到大排序。请写出完整代码并详细解释如何利用`sorted`的灵活性实现该复杂排序逻辑。
31.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
class MyClass:
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

my_list = [MyClass(1, 2), MyClass(3, 4), MyClass(1, 3)]

def custom_sort_key(obj):
    sum_value = obj.value1 ** 2 + obj.value2 ** 3
    abs_value1 = abs(obj.value1)
    return (-sum_value, abs_value1)

sorted_list = sorted(my_list, key=custom_sort_key)

for obj in sorted_list:
    print(f"value1: {obj.value1}, value2: {obj.value2}")

代码解释

  1. 定义MyClass
    • 首先定义了一个MyClass类,它有两个属性value1value2,通过构造函数__init__进行初始化。
  2. 创建实例列表
    • 创建了一个包含多个MyClass实例的列表my_list
  3. 定义排序规则函数
    • 定义了一个custom_sort_key函数,这个函数接收一个MyClass实例作为参数。
    • 在函数内部,计算value1的平方与value2的立方之和sum_value,同时获取value1的绝对值abs_value1
    • 返回一个元组(-sum_value, abs_value1),之所以在sum_value前加负号,是为了实现从大到小排序(因为sorted默认是从小到大排序),对于abs_value1则按从小到大排序。
  4. 使用sorted函数进行排序
    • 使用sorted函数对my_list进行排序,key参数指定为custom_sort_key,这样就会按照我们定义的复杂规则进行排序。
  5. 输出结果
    • 最后通过循环遍历排序后的列表,输出每个实例的value1value2属性值。