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 >>> 
posted @ 2019-05-27 18:20  Maserati~  阅读(207)  评论(0)    收藏  举报