sorted(iterable, , key=None, reverse=False)
list.sort(, key=None, reverse=False)
iterable -- 可迭代对象。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
1、sorted()作用于任意可迭代的对象,而sort()一般作用于列表。
In [25]: a = (1,2,3,4)
In [26]: sorted(a)
Out[26]: [1, 2, 3, 4]
In [27]: a.sort()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in ()
----> 1 a.sort()
AttributeError: 'tuple' object has no attribute 'sort'
2、sorted()会返回一个排序后的列表,原有列表保持不变,而sort()会直接修改原有的列表,函数返回为None。
In [28]: a = [34,4,3,56,66]
In [29]: sorted(a)
Out[29]: [3, 4, 34, 56, 66]
In [30]: a.sort()
In [31]:
因此如果实际应用过程中需要保留原有列表,使用sorted()较为合适,否则可以选择sort(),因为sort()不需要复制原有列表,消耗的内存较少,效率也较高。
3、key针对每个元素仅作一次处理。
from timeit import Timer
a_time = Timer(stmt='sorted(xs,key=lambda x:x[1])',setup='xs=range(100);xs=zip(xs,xs);').timeit(10000)
print(a_time)
4、sorted()能针对不同的数据结构进行排序,结合operator模块的itemgetter()方法实现。
operator.itemgetter()官方说明:
https://docs.python.org/3.6/library/operator.html?highlight=itemgetter#operator.itemgetter
对字典排序:
from operator import itemgetter
phonebook = {'Linda':'7750','Bob':'9345','Carol':'5834'}
sorted_pb = sorted(phonebook.items(),key=itemgetter(1))
print(sorted_pb)
结果:
[('Carol', '5834'), ('Linda', '7750'), ('Bob', '9345')]
对多维list排序:
from operator import itemgetter
gameresult = [
['Bob',95.00,'A'],
['Alan',86.00,'C'],
['Mandy',82.5,'A'],
['Rob',86,'E']
]
# 当等级相同的时候,分数从低到高排序
sorted_gr = sorted(gameresult, key=itemgetter(2,1))
print(sorted_gr)
结果:
[['Mandy', 82.5, 'A'], ['Bob', 95.0, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E']]