python的sort函数与sorted函数排序

这篇具有很好参考价值的文章主要介绍了python的sort函数与sorted函数排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. sort函数

  sort函数为python内置的列表排序高阶函数,所谓高阶函数,也就是参数为函数或返回值为函数。

  先看个简单的例子:

# 数字列表的排序示例
nums = [5, 2, 9, 1, 7] nums.sort()
print(nums) # 输出:[1, 2, 5, 7, 9]

  可以发现排序后,改变了原列表的顺序。而且sort()函数没有返回值,或者说返回值是None。再看sort函数的语法:

  sort函数的语法是:list.sort(key=None, reverse=False)

  参数说明:

  key:指定用于排序的函数,可以指定一个函数,这个函数接受一个参数并返回一个用于排序的关键字,默认为None,表示按照列表的元素排序,但是要求每个元素的数据类型相同

  reverse:如果为True,则列表会以降序排序,默认为False,即升序排序。

nums = [5, 2, 9, 1, 7]
nums.sort(reverse=True)
print(nums)  # 输出:[9, 7, 5, 2, 1]
#如果是字符,元素就应该统一全部是字符,按照编码大小比较。
nums = ['5', '2', '9','T' '1', '7','!','t','1']
nums.sort(reverse=True)
print(nums)  # 输出:['t', 'T1', '9', '7', '5', '2', '1', '!']

  如果每个元素为列表或元组、字典,在key=None的情况下又该如何比较大小呢?

当key=None时:

  • 元素为列表的列表排序

  讲解元素为列表的列表之前先看个代码:

list01=[3,1]
list02=[0,1,1]
print(list01>list02)#True

  可以看到是先比较两个列表元素的第一个,显然3>0,运算结果是True(如果相等,继续比较后面的,注意,并不是比较列表的长度大小)。

  再看下面例子:

# 比较时,相互比较的元素数据类型要相同,否则报错
list01=[3,1]
list02=['0',1,1]
print(list01>list02)#报错报错报错TypeError: '>' not supported between instances of 'int' and 'str'

  还有一种特殊的例子:

list01=[3,1]
list02=[0,'1',1]
print(list01>list02)#True

  这种情况不会报错,因为比较第一个元素时,已经能分出大小了。

  元素为列表的排序先看2个例子,再分析。

lst1=[[0,1],[1,1,2]]
lst2=[[1,1],[0,2]]
print(lst1>lst2)#False

lst1=[[1,1],[1,1,2]]
lst2=[[1,1],[2,2]]
print(lst1>lst2)#False

  所以,当元素为列表时,依然按照前面的方法比较大小,lst中的第一个元素[0,1]lst中的第一个元素[1,1]比较大小,[0,1][1,1]比较大小再次按照列表的比较大小规则即可。下面为key=None时,调用sort后的排序例子。

 mylist = [[1, 1, 0], [2, 0], [1, 2], [1, 1], [2, 0, 3], [3], [2], [1, 2, 3, 4, 5]]
 mylist.sort()
 print(mylist)#[[1, 1], [1, 1, 0], [1, 2], [1, 2, 3, 4, 5], [2], [2, 0], [2, 0, 3], [3]]

  通过上面例子可以发现,当key=None时,排序规则和列表的简单排序一样,比如[1,1,0]>[1,1],前面两个元素相等时,就看长度,长度大的大。

  • 元素为元组的列表

  先说元组,由于sort是对原址排序,而元组内部不可修改,所以直接对元组是不能排序的。但是,我们的数据类型是列表,列表的每一个元素是元组,由于整体是列表类型,当然可以调用sort函数排序了。先看元组如何比较大小:

print((4,2)>(2,3))#True
print((4,2)>(2,2,1))#True

  也就是说元组比较大小和简单列表比较大小的规则相同。

tuple1=[(4,2),(2,3),(3,1)]
tuple1.sort()
print(tuple1)#[(2, 3), (3, 1), (4, 2)]
  • 元素为字典的列表

  先看个例子:

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 2, 'a': 1}
dict3 = {'a': 1, 'b': 3}
print(dict1 == dict2)  # True,与顺序无关
print(dict1 == dict3)  # False
print(dict1 > dict3)  # 报错TypeError: '>' not supported between instances of 'dict' and 'dict'

  两个字典不能直接比较大小,==(调用了__eq__()函数)是比较内容是不是一样的。所以元素为字典的列表是不能直接调用sort函数排序的

key不为None:

  按照自定义的规则进行排序。我们需要给key传入一个函数作为参数,按照函数的规则进行排序。这个函数接受一个参数并返回一个用于排序的关键字。具体是什么意思呢?先看个简单的例子:

lst=[[1, 2], [1, 1], [2, 0], [6, 3,0], [1, 2,3]]
def sort_by_first_element(lst):
    return lst[0]
lst.sort(key=sort_by_first_element)
print(lst)#[[1, 2], [1, 1], [1, 2, 3], [2, 0], [6, 3, 0]]

  将参数传入给了sort函数的key,观察排序的结果,可以发现上面代码元素的排序是按照每个元素(仍然是列表)的第一个元素进行比较大小的,不比较第二个元素,若第一个元素相等,则两个元素相等,不改变顺序,比如[1,2][1,1]按照排序规则是相等的。进一步,观察sort_by_first_element这个函数,返回值是lst[0]。似乎返回的是[1,2]。又是怎么做到比较每一个元素(列表)的第一个元素的呢?仔细思考,sort_by_first_element(lst):中的lst其实是形参,另外,可以发现一定是sort函数内部实现了排序,其根据给定原始列表信息lst及函数sort_by_first_element返回值是能实现排序结果的,也就是说想要返回元素的第一个元素,那么sort_by_first_element(lst)中的lst可能传入参数时像这样:sort_by_first_element(lst[0]),sort_by_first_element(lst[1])等,再返回lst[0]时,就真正做到了返回元素的第一个元素。这里用自己的方法实现一下sort函数(猜测python内部可能采用了快速排序用C语言实现了sort函数,实现排序)。代码如下:

"""
MyLIst类定义了sort方法用于对列表排序
"""
class MyList:
    def __init__(self, mylist=None):
        """
        :param mylist: 传入一个列表
        """
        self.mylist = mylist

    def sort(self, key=None):  # key传入函数名
        print("对象调用了MyList类里面的sort方法")
        lst = []
        for item in self.mylist:
            lst.append(item)
        print("排序前:", lst)
        # 冒泡排序
        try:
            for i in range(len(self.mylist) - 1):  # [0,长度-1),只需要循环  长度-1 次就能排序完,最后一个元素可以不用排序
                for j in range(0, len(self.mylist) - 1 - i):
                    if key(self.mylist[j]) > key(self.mylist[j + 1]):
                        self.mylist[j], self.mylist[j + 1] = self.mylist[j + 1], self.mylist[j]  # python的语法支持这种交换
        except Exception as e:
            print(e)
            print("可能是索引越界了")
def __str__(self): return str(self.mylist) def sort_by_first_element(lst): return lst[0] def sort_by_second_element(lst): return lst[1] if __name__ == '__main__': mylist=MyList([[1, 1, 0], [2, 0],[1, 2], [1, 1], [2, 0, 3]]) mylist.sort(key=sort_by_first_element)#对第一个元素进行排序 print("排序后" ':',end=' ') print(mylist)#调用__str__() mylist2 = MyList([[1, 1, 0], [2, 0], [1, 2], [1, 1], [2, 0, 3]]) #或者传入lambda匿名函数 mylist2.sort(key=lambda e:e[1])#对第二个元素进行排序,相当于 mylist.sort(key=sort_by_second_element) print("排序后" ':', end=' ') print(mylist2)

  运行结果:

python的sort函数与sorted函数排序

  key后面传入lambda匿名函数,更简洁。我们可以改变key传入的函数,来改变排序规则,下面给一个自定义按长度实现排序的例子:

mylist=[[1, 1, 0], [2, 0],[1, 2], [1, 1], [2, 0, 3],[3],[2],[1,2,3,4,5]]
mylist.sort(key=lambda e:len(e))#长度进行排序
print(mylist)#[[3], [2], [2, 0], [1, 2], [1, 1], [1, 1, 0], [2, 0, 3], [1, 2, 3, 4, 5]]

  根据字典的值对列表进行排序:

lst = [{'name': 'Alice', 'age': 25},
       {'name': 'Bob', 'age': 30},
       {'name': 'Charlie', 'age': 20}]
# 使用sort方法排序(原址排序)
lst.sort(key=lambda x: x['age'])#改变原列表顺序
print(lst)  # 输出:[{'name': 'Charlie', 'age': 20}, {'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]

2. sorted函数

  sorted函数Python内置的一个函数,用于对可迭代对象进行排序操作。它的基本用法如下:

  sorted(iterable, key=None, reverse=False)

  参数:

  iterable:可迭代对象,比如列表、元组、字符串等。

  key:可选参数,用于指定排序的关键字函数,它接收一个参数并返回一个用于排序的关键字。如果不指定该参数,则默认按照元素的自然顺序排序。

  reverse:可选参数,为一个布尔值,默认为False,表示升序排序。如果设置为True,则表示降序排序。

  返回值:返回一个新的已排序的列表。

lst = [5, 2, 9, 1, 8]
sorted_lst = sorted(lst)
print(sorted_lst)  # 输出:[1, 2, 5, 8, 9],没有改变lst的元素顺序

str = "hello"
sorted_str = sorted(str)
print(sorted_str)  # 输出:['e', 'h', 'l', 'l', 'o']
#注意并没有改变原来str字符串的序列顺序,而且字符串本身也不能改变

  看一个key不为None的例子

lst = [{'name': 'Alice', 'age': 25},
       {'name': 'Bob', 'age': 30},
       {'name': 'Charlie', 'age': 20}]
# 使用sorted函数排序
sorted_lst = sorted(lst, key=lambda x: x['age'])#返回新的列表,不改变原列表顺序
print(sorted_lst)  # 输出:[{'name': 'Charlie', 'age': 20}, {'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]

 文章来源地址https://www.toymoban.com/news/detail-513617.html

小结:sort函数用于列表的排序,更改原序列。而sorted用于可迭代对象的排序(包括列表),返回新的序列;注意,如果元素逐个比较相等时,就比较长度,比如:[1,1]<[1,1,0];常用高阶函数除了sortsorted之外,还有mapfiltermax等。sorted函数,sorted函数内部是C语言快速排序,运行快,返回修改后的新列表,不改变原列表的顺序。

 

  若存在不足或错误之处欢迎指正与评论,觉得有用,请点个赞!

 

到了这里,关于python的sort函数与sorted函数排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python的sort()与sorted()函数详解

    目录 sort()函数 sorted()函数 key参数 区别 sort() 方法:该方法用于原地对列表进行排序,即直接在原始列表上进行排序操作,并不返回一个新的列表。 sorted() 函数:该函数对可迭代对象进行排序,并返回一个新的已排序的列表。原始列表不会被修改。 对字符串进行排序时

    2024年02月09日
    浏览(33)
  • Python基础知识:整理15 列表的sort方法

    之前我们学习过 sorted() 方法,可以对列表、元组、集合及字典进行排序                                                                                      但是上述的方法对于嵌套的数据就不好实现排序了,sort()方法便可以登场了!

    2024年01月19日
    浏览(50)
  • python算法 之 快速排序(Quick Sort)

    时间复杂度 名称 示例算法 O(1) 常数时间复杂度 哈希表查找 O(logn) 对数时间复杂度 二分查找 O(n) 线性时间复杂度 遍历数组 O(nlogn) 线性对数时间复杂度 快速排序 O(n^2) 平方时间复杂度 冒泡排序、插入排序 O(n^3) 立方时间复杂度 矩阵乘法 O(2^n) 指数时间复杂度 穷举搜索 O(n!) 阶

    2024年02月04日
    浏览(39)
  • Sorting Algorithms in Python (排序算法)

    本篇文章主要介绍几种经典排序算法:冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、桶排序和基数排序。并给出用python实现的算法代码。 目录 一、冒泡排序 二、快速排序 三、选择排序 四、堆排序 五、插入排序 六、希尔排序 七、归并排序 八

    2024年04月15日
    浏览(40)
  • python中sorted()函数解析

    sorted() 函数对所有可迭代的对象进行排序操作。 sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础

    2024年02月03日
    浏览(36)
  • Python基础之sorted()函数用法

    本篇是关于sorted()函数的一些基本用法,如有不足缺陷欢迎补充指正。 1、简单的排序 sorted函数可以对可迭代类型的容器内的数据进行排序 2、进阶使用 sorted(L,key=···) 其中key用来接收一个自定义的排序规则 3、选择升序还是降序排列方式 其中sorted函数是默认升序排序,

    2024年02月11日
    浏览(48)
  • Python 函数 sort(),sorted() 之区别及 key=lambda x:x[] 之理解

            实务中,我们经常需要将数据排序,Python 内置函数 sorted() 及列表操作函数 sort() 均可实现该功能。         二者的完整语法如下: key:排序依据,通常为函数名,如 abs、str.lower、str.upper 等;或以函数指定可迭代对象中的某个元素来进行排序。 reverse:排序规

    2024年02月03日
    浏览(39)
  • 【排序算法详细介绍】桶排序(Bucket Sort)冒泡排序(Bubble Sort)快速排序(Quick Sort)

    今天学习了一些简单的 排序算法 ,其实在我们平时解决问题中经常用到,今天正好一起看了看,记录一下。 如果对你也有帮助,我很开心~ 桶排序是一种排序算法,它将数组划分为一些 有序的桶 ,然后 每个桶再分别排序 。最后,将所有的桶合并起来,得到一个有序的数组。桶排

    2024年01月25日
    浏览(47)
  • 排序算法(stable_sort(), sort())

    sort函数我相信大家都不陌生,今天介绍一个新的排序算法stable_sort stable_sort:稳定排序算法,维持相等元素的原有顺序。 假如我们定义一个字符串数组 这些字符串是按照字典序排列的,我们现在想要words按照单词长度从小到大重排的同时,还希望具有相同长度的元素按照字典

    2024年02月07日
    浏览(51)
  • 【排序算法】堆排序(Heap Sort)

    堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 学习堆排序之前,有必要了解堆!若读者不熟悉堆,建议先了解堆(建议可以通过二叉堆,左倾堆,

    2024年02月01日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包