Python:关于sorted()函数和sort()两者之间的区别?

阿杰阿杰 · 2022-02-27 18:00
为什么调用一个reverse=True,而两者的调用方法不一样。一个是sorted(viewpoints,reverse=True);另一个是viewpoints.sort(reverse=True)。这里有什么区别么?
1 个回答
许山山
许山山

sorted() 返回一个新的对象, 原本的对象不受影响. list.sort() 是对列表进行原地排序, 返回值是 None.

sorted() 可以作用于所有的可迭代对象,并不局限于 list,例如字符串、元组、字典(默认只对 key 排序),生成器等等,返回值是一个已经排好序的列表。

In [1]: li = [1, 7, 3, 2, 4]
   ...: print("li.sort 的返回值:", li.sort())
   ...: print("sorted 的返回值:", sorted(li))
li.sort 的返回值: None
sorted 的返回值: [1, 2, 3, 4, 7]

In [2]: li = [1, 7, 3, 2, 4]
   ...: print("排序前 li:", li)
   ...: li.sort()
   ...: print("排序后 li:", li)
   ...: print('------------------------')
排序前 li: [1, 7, 3, 2, 4]
排序后 li: [1, 2, 3, 4, 7]
------------------------   

In [3]: li1 = [1, 7, 3, 2, 4]
   ...: print("排序前 li1:", li1)
   ...: li2 = sorted(li1)
   ...: print("排序后 li1:", li1)
   ...: print("排序后 li2:", li2)
排序前 li1: [1, 7, 3, 2, 4]
排序后 li1: [1, 7, 3, 2, 4]
排序后 li2: [1, 2, 3, 4, 7]

如果你希望对列表进行原地排序,使用 list.sort(),如果你想要返回一个新的列表,使用 sorted。如果你要排序的对象不是列表,使用 sorted。

对于列表来说,list.sort() 会稍微快一点,因为它是原地排序,不需要额外的复制数据。对于其他的可迭代对象来说,你别无原则(只能用 sorted)。

以上参考so: https://stackoverflow.com/questions/22442378/what-is-the-difference-between-sortedlist-vs-list-sort


补充说明:

1)什么叫原地。可以使用 id 查看对象在内存中的地址,如果 id 的返回值相同,说明对象占用了同一个内存地址,也就是说排序后对象在内存中的位置没有发生改变,只是里面的索引变了。

In [4]: li = [1, 7, 3, 2, 4]
   ...: print("list.sort 前 li 的 id:", id(li))
   ...: li.sort()
   ...: print("list.sort 后 li 的 id:", id(li))
list.sort 前 li 的 id: 2244039100168
list.sort 后 li 的 id: 2244039100168 --> 这里 id 完全相同

In [5]: li = [1, 7, 3, 2, 4]
   ...: print("sorted 前 li 的 id:", id(li))
   ...: li2 = sorted(li)
   ...: print("sorted 后 li 的 id:", id(li))
   ...: print("sorted 后 li2 的 id:", id(li2))
sorted 前 li 的 id: 2244039031560
sorted 后 li 的 id: 2244039031560
sorted 后 li2 的 id: 2244039100168 --> li2 的地址与 li 不同,说明 li2 是一个与 li 不同的对象

2)其他可迭代对象的例子:

In [6]: s = 'an apple a day'
   ...: print(sorted(s))
   ...: dic = {'hello': 1, 'world': 2, '!': 3}
   ...: print(sorted(dic))
   ...: print(sorted(dic.items(), key=lambda x: x[-1])) # 对字典按值排序
[' ', ' ', ' ', 'a', 'a', 'a', 'a', 'd', 'e', 'l', 'n', 'p', 'p', 'y']
['!', 'hello', 'world']
[('hello', 1), ('world', 2), ('!', 3)]


赞同
反对
评论
收藏
2022-02-27 21:12
前往发表回答