Python sort()与sorted()
********************************************************************
*****摘自<编写高质量代码 改善Python程序的91个建议>*****
********************************************************************
Python中常用的排序函数有sort()和sorted(),这两个函数并不完全相同
1)相比于sort(),sorted()使用的范围更为广泛
- sorted(iterable[,cmp[,key[,reverse]]])
- s.sort([cmp[,key[,reverse]]])
这两个函数有三个共同的参数:
- cmp:为用户定义的任务比较函数,函数的参数为两个可比较的元素(来自iterable或list),函数根据第一个参数与第二个参数的关系,依次返回-1、0或者+1(第一个参数小于第二个参数时返回负数)。该参数默认值为None。
- key:是带一个参数的函数,用来为每个元素提取比较值,默认为None(即直接比较每个元素)
- reverse:表示排序结果是否反转,默认不反转。
1 >>> persons = [{'name':'jon', 'age':32}, {'name':'Alan', 'age':50}, {'name':'Bob', 'age':23}]>>> sorted(persons,key=lambda x: (x['name'], x['age'])) 2 [{'name': 'Alan', 'age': 50}, {'name': 'Bob', 'age': 23}, {'name': 'jon', 'age': 32}] 3 >>>
从函数的定义形式可以看出,sorted()作用于任意可迭代的对象,而sort()一般用于列表。针对元组使用sort()方法会抛异常AttributeError,而sorted()函数则没有这个问题
1 >>> a = (1,2,4,2,3,5,1) 2 >>> a.sort() 3 Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5 AttributeError: 'tuple' object has no attribute 'sort' 6 >>> sorted(a) 7 [1, 1, 2, 2, 3, 4, 5] 8 >>>
2)当排序对象为列表的时候两者适合的场景不同
- sorted()函数会返回一个排序后的列表,原有列表保持不变;
- sort()函数直接修改原有列表,函数返回值为None
1 >>> a = [1,2,4,2,3,5,1] 2 >>> sorted(a) 3 [1, 1, 2, 2, 3, 4, 5] 4 >>> print(a.sort()) 5 None 6 >>> a 7 [1, 1, 2, 2, 3, 4, 5] 8 >>>
因此如果实际应用中需要保留原有列表,使用sorted()函数更合适,否则可选择sort()函数,因为sort()函数不需要复制原有列表,消耗内存,效率也更高。
3)sorted()函数非常强大,可以方便地对不同数据结构进行排序,满足不同的需求
- 对字典值进行排序
1 >>> phonebook = {"Linda":7750, "Bob":9345, "Carol":5834} 2 >>> sorted(phonebook.items(), key=lambda x: x[1]) 3 [('Carol', 5834), ('Linda', 7750), ('Bob', 9345)] 4 >>>
- 对多维列表进行排序
1 >>> gameresult = [['Bob', 95.00, 'A'], ['Alan', 86.0, 'C'], ['Mandy', 82.5, 'A'], ['Rob', 86, 'E']] 2 >>> sorted(gameresult, key=lambda x:(x[2],x[1])) 3 [['Mandy', 82.5, 'A'], ['Bob', 95.0, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E']] 4 >>>
- 对字典中混合list进行排序
1 >>> my_dict = { 2 ... 'Li': ['M', 7], 3 ... 'Zhang': ['E', 2], 4 ... 'Wang': ['P', 3], 5 ... 'Du': ['C', 2], 6 ... 'Ma': ['C', 9], 7 ... 'Zhe': ['H', 7]} 8 >>> sorted(my_dict.items(), key = lambda x: x[1][1]) 9 [('Zhang', ['E', 2]), ('Du', ['C', 2]), ('Wang', ['P', 3]), ('Li', ['M', 7]), ('Zhe', ['H', 7]), ('Ma', ['C', 9])] 10 >>>
- 对list中混合字典进行排序
1 >>> gameresult = [{'name':'Bob', 'win':10, 'losses':3, 'rating': 75.00}, 2 ... {'name':'Divid', 'win':3, 'losses':5, 'rating': 57.00}, 3 ... {'name':'Carol', 'win':4, 'losses':5, 'rating': 57.00}, 4 ... {'name':'Patty', 'win':9, 'losses':3, 'rating': 71.48}] 5 >>> sorted(gameresult, key=lambda x: (x['rating'], x['name'])) 6 [{'name': 'Carol', 'win': 4, 'losses': 5, 'rating': 57.0}, {'name': 'Divid', 'win': 3, 'losses': 5, 'rating': 57.0}, {'name': 'Patty', 'win': 9, 'losses': 3, 'rating': 71.48}, {'name': 'Bob', 'win': 10, 'losses': 3, 'rating': 75.0}] 7 >>>
出来混,迟早是要还的...

浙公网安备 33010602011771号