sort、sorted函数详解(含代码示例)

1.list.sort()

list.sort(*, key=None, reverse=False) 此方法会对列表进行原地排序,默认排序为升序。 异常不会被屏蔽 —— 如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。(注意,只有list有这个sort函数,sort方法只是为列表定义的)。

函数参数定义:
key 指定带有一个参数的函数,用于从每个列表元素中提取比较键 (例如 key=str.lower),可以是匿名函数,也可是自定义的函数。 key函数排序的过程中,对应于列表中每一项的键会被计算一次默认值 None 表示直接对列表项排序而不计算一个单独的键值

reverse:布尔值的 reverse 参数。这用于标记降序排序,reverse为True表示按照降序排列,默认为False

例子:

key为None:

>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]

常见的设置key的例子,使用对象的一些索引作为键,对复杂对象进行排序

def takeSecond(elem):
    return elem[1]
 
# 列表
r = [(2, 2), (3, 4), (4, 1), (1, 3)]
 
# 指定第二个元素排序
r.sort(key=takeSecond)
print (r)
r.sort(key=takeSecond,True)
print (r)

# 或者采用匿名函数定义key
# r.sort(key=lambda x: x[1])

结果输出如下
在这里插入图片描述
更多内容(可了解)
在python 2.x中,没有key参数,使用的是cmp参数,直接采用的类似c中的qsort的实现方式,传入cmp参数指明按照什么顺序进行排序,关于qsort可以参考qsort的使用,为了向下兼容,可以使用 functools.cmp_to_key() 将 2.x 风格的 cmp 函数转换为 key 函数。

在 Py2.x 中, sort 允许一个可选函数,可以调用它来进行比较。该函数应该采用两个参数进行比较,然后返回负值为小于,如果它们相等则返回零,或者返回大于大于的正值。例如,我们可以这样做:
在这里插入图片描述
在python3中可以通过functools.cmp_to_key() 将cmp转为key函数。
在这里插入图片描述
这个functools.cmp_to_key() 的具体实现,就是如下的这个包装器,可以了解一下。

def cmp_to_key(mycmp):
    'Convert a cmp= function into a key= function'
    class K:
        def __init__(self, obj, *args):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0
    return K

reverse 为一个布尔值。 如果设为 True,则每个列表元素将按反向顺序比较进行排序

>>> a = [5, 2, 3, 1, 4]
>>> a.sort(reverse=True)
>>> a
[5, 4, 3, 2, 1]

当顺序大尺寸list时此方法会原地修改该序列以保证空间经济性。 为提醒用户此操作是通过间接影响进行的,它并不会返回排序后的序列(请使用 sorted() 显示地请求一个新的已排序列表实例)。

sort() 方法确保排序是稳定的。 如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 — 这有利于进行多重排序(例如先按部门、再接薪级排序)。

CPython implementation detail: 在一个列表被排序期间,尝试改变甚至进行检测也会造成未定义的影响。 Python 的 C 实现会在排序期间将列表显示为空,如果发现列表在排序期间被改变将会引发 ValueError。


2.sorted()

sorted(iterable, *, key=None, reverse=False) 根据 iterable中的项返回一个新的已排序列表。sorted函数可以接受任何可迭代对象,sorted() 返回排好序的新列表。

key,reverse参数与list.sort()方法的参数含义是相同的。而且,它也可以使用 functools.cmp_to_key() 将老式的 cmp 函数转换为 key 函数, sorted() 也可以确保排序是稳定的。

与sort方法不同的是,sorted方法会返回一个新的已排序的列表,而sort方法会直接修改原列表(并返回 None 以避免混淆),另外list.sort() 方法只是为列表定义的,而 sorted() 函数可以接受任何可迭代对象。

例子

key为None

>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

对除list类型的可迭代对象排序

>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]

在这里插入图片描述
在这里插入图片描述

3.Operator 模块函数

向上面显示的key函数模式非常常见,因此 Python 提供了便利功能,使访问器功能更容易,更快捷。 operator 模块有 itemgetter() 、 attrgetter() 和 methodcaller() 函数。

使用这些函数,上面的例子可以变得更简单,更快捷:
在这里插入图片描述
关于methodcaller() 函数的使用可参考https://blog.csdn.net/qq_41158271/article/details/108665918

另外,Operator 模块功能允许多级排序。 例如,按 grade 排序,然后按 age 排序
在这里插入图片描述

需要注意的一点:Python 中这两个内置函数,使用的 Timsort 算法,时间复杂度为 O ( N l o g N ) O(Nlog N) O(NlogN)


小结

  • sort方法只是为列表定义的,而sorted适用于任何可迭代的对象
  • sort方法会对列表进行原地排序,并返回None。sorted方法会返回一个新的已排序的列表。
  • 如果对于一个大尺寸list,使用sort方法会原地修改该序列以保证空间经济性
  • python中的key函数模式非常常见,因此python提供的Operator 模块函数,使访问器功能更容易,更快捷。

关于这两种方法更详细的内容可以看官方的排序部分,链接如下:
https://docs.python.org/zh-cn/3.7/howto/sorting.html#sortinghowto

  • 17
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Python sorted函数可以用来对列表进行排序,它接收一个可迭代对象作为参数,返回排序后的新列表。示例如下:myList = [3, 8, 5, 1, 9] sortedList = sorted(myList)# sortedList = [1, 3, 5, 8, 9] ### 回答2: Python中的sorted函数是一个非常有用的函数,它用于对可迭代对象进行排序操作。sorted函数可以接受一个可迭代对象作为参数,并返回一个经过排序的新的列表。 sorted函数的基本用法是sorted(iterable, key=None, reverse=False)。其中,iterable表示要排序的可迭代对象,key表示排序的基准,reverse表示排序的顺序。 如果不指定key参数,则sorted函数将按照默认的排序方式进行排序。默认情况下,sorted函数会将可迭代对象中的元素按照从小到大的顺序进行排序。如果可迭代对象中的元素是字符串,那么按照字母的顺序进行排序。 如果想要按照其他的排序方式进行排序,可以使用key参数。key参数接受一个函数作为参数,这个函数将会在排序时作为排序的依据。例如,如果想要按照元素的长度进行排序,可以将len函数作为key参数传入。 另外,reverse参数可以用来控制排序的顺序。如果reverse=True,那么排序的结果将会按照从大到小的顺序排列。 除了传统的列表排序外,sorted函数还可以对字符串进行排序。当对字符串进行排序时,默认情况下会按照字母的顺序进行排序。如果希望使用其他排序方式,仍然可以使用key参数进行指定。 需要注意的是,sorted函数会返回一个新的排序后的列表,原来的可迭代对象不会被改变。如果需要对原来的列表进行排序,可以使用sort方法。 综上所述,Pythonsorted函数是一个用于排序的强大工具,它可以对可迭代对象进行排序,并且可以通过key和reverse参数来控制排序的方式和顺序。它的灵活性和易用性使得它在实际的开发中得到了广泛的应用。 ### 回答3: Python中的sorted函数是一个内置函数,用于对可迭代对象进行排序操作。它接受一个可迭代对象作为参数,并返回一个新的已排序的列表。 sorted函数的基本语法如下: sorted(iterable, key, reverse) 其中,iterable参数是表示可迭代对象的集合,如列表、元组或字符串等。key参数是一个可选的函数,用于指定排序的键。reverse参数是一个可选的布尔值,默认为False,表示升序排列;如果设为True,则表示降序排列。 示例如下: ``` numbers = [5, 2, 8, 1, 7] sorted_numbers = sorted(numbers) print(sorted_numbers) ``` 输出结果为:[1, 2, 5, 7, 8] 在上面的示例中,我们传入了一个列表numbers给sorted函数进行排序。返回结果sorted_numbers是一个新的已排序的列表。 我们也可以指定reverse参数来改变排序的顺序: ``` numbers = [5, 2, 8, 1, 7] sorted_numbers = sorted(numbers, reverse=True) print(sorted_numbers) ``` 输出结果为:[8, 7, 5, 2, 1] 在这个例子中,我们将reverse参数设为True,使得sorted函数按降序排列。 此外,我们还可以使用key参数来指定一个函数,根据函数的返回值进行排序: ``` fruits = ['apple', 'banana', 'cherry', 'date'] sorted_fruits = sorted(fruits, key=len) print(sorted_fruits) ``` 输出结果为:['date', 'apple', 'cherry', 'banana'] 在这个例子中,我们使用key=len来指定一个函数,表示根据字符串的长度进行排序,从而得到按字符串长度升序排列的结果。 总而言之,Pythonsorted函数是一个非常有用的工具,它可以帮助我们对可迭代对象进行排序操作。我们可以根据需要指定排序的顺序和规则,从而得到我们想要的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值