首页 > 编程知识 正文

如何传递参数给Python函数sorted

时间:2023-11-22 09:55:25 阅读:293087 作者:PYEW

Python内置函数sorted可以对序列进行排序,函数sorted提供了多样的参数传递方式,可以方便地控制排序的具体方式和范围。在本文中,我们将会从多个方面对如何传递参数给Python函数sorted进行阐述。

一、传递基本的可迭代对象

在函数sorted中最简单的例子就是传递一个基本的可迭代对象,例如字符串、列表、元组等。对于这些可迭代对象,我们只需要直接传递给函数sorted即可:

a = [3, 1, 4, 1, 5, 9, 2, 6]
b = sorted(a)
print(b)  # 输出 [1, 1, 2, 3, 4, 5, 6, 9]

在传递可迭代对象时,函数sorted默认按照元素的大小进行排序。

二、传递关键字参数

除了默认的元素大小排序方式,函数sorted还支持通过关键字参数进行排序。例如我们可以通过传递reverse参数实现将序列降序排序:

a = [3, 1, 4, 1, 5, 9, 2, 6]
b = sorted(a, reverse=True)
print(b)  # 输出 [9, 6, 5, 4, 3, 2, 1, 1]

还可以使用关键字参数key,它可以指定一个函数用来作为排序的依据:

a = ['First', 'second', 'third', 'fourth']
b = sorted(a, key=lambda x: x.lower())
print(b)  # 输出 ['First', 'fourth', 'second', 'third']

在上面的代码中,我们使用了lambda函数作为key参数来比较大小,实现了不区分大小写的字符串排序。

三、传递cmp_to_key函数

Python 2.x版本中,函数sorted支持传递一个cmp函数参数,它接收两个参数并返回一个小于、等于或大于零的整数作为比较结果。而在Python 3.x版本中,这个参数被移除了。

不过,Python 3.x中可以通过functools.cmp_to_key函数来模拟实现cmp函数的功能。这个函数接受一个比较函数,返回一个可以用于排序的key函数:

import functools
a = ['ab', 'xy', 'cd', 'efg']
b = sorted(a, key=functools.cmp_to_key(lambda x, y: len(x) - len(y)))
print(b)  # 输出 ['ab', 'xy', 'cd', 'efg']

在上面的代码中,我们使用cmp_to_key函数将一个接受两个参数的函数转化为一个可以用于key参数的函数,实现按照字符串长度排序。

四、传递装饰器函数

装饰器函数可以用于对函数sorted的行为进行定制。例如,我们可以为函数sorted定义一个装饰器函数,它将排序结果去掉重复的元素:

def unique_sorted(func):
    def wrapper(seq):
        return list(set(func(seq)))
    return wrapper

@unique_sorted
def my_sorted(seq):
    return sorted(seq)

a = [3, 1, 4, 1, 5, 9, 2, 6]
b = my_sorted(a)
print(b)  # 输出 [1, 2, 3, 4, 5, 6, 9]

在上面的代码中,我们定义了一个unique_sorted装饰器函数,它接收一个排序函数作为参数,返回一个新的函数实现去重的功能。我们通过@语法将自定义的函数my_sorted应用了装饰器unique_sorted,从而实现了自定义函数的功能扩展。

五、传递自定义对象

在Python中,我们可以通过定义__lt__、__le__、__eq__等比较方法来实现自定义对象的大小比较。通过传递自定义对象到函数sorted的key参数中,我们可以实现对自定义对象的排序操作。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        return self.age < other.age

    def __repr__(self):
        return f"Person({self.name}, {self.age})"

people = [Person('bob', 25), Person('mary', 33), Person('dave', 15)]
p_sorted = sorted(people, key=lambda x: x.age)
print(p_sorted)  # 输出 [Person(dave, 15), Person(bob, 25), Person(mary, 33)]

在上面的代码中,我们定义了一个Person类,实现了__lt__方法自定义对象的大小比较方式。通过传递对象列表和自定义的key函数,我们实现了按照Person对象的age属性排序。

总结

Python函数sorted可以实现对序列元素的排序,通过传递不同的参数,我们可以实现不同的排序方式和范围。本文从五个方面对传递参数给sorted函数进行了阐述,它们分别是传递基本可迭代对象、传递关键字参数、传递cmp_to_key函数、传递装饰器函数和传递自定义对象。在实际编程过程中,掌握不同的参数传递方式可以让代码更加简洁优雅。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。