Python:关于sorted()函数和sort()两者之间的区别?
为什么调用一个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)]