python sort 和 sorted
2018-01-26 本文已影响0人
lxy_悦
1、list 的内置 sort() 方法
在原有list上做操作,改变了原有list
class list(object):
def sort(self, cmp=None, key=None, reverse=False):
pass
示例:
# -*- coding: utf-8 -*-
if __name__ == '__main__':
a = [2, 1, 4, 5, 3]
a.sort()
print a
输出:
[1, 2, 3, 4, 5]
2、sorted()
def sorted(iterable, cmp=None, key=None, reverse=False):
pass
示例:
# -*- coding: utf-8 -*-
if __name__ == '__main__':
a = [2, 1, 4, 5, 3]
b = sorted(a)
print a
print b
输出:
[2, 1, 4, 5, 3] # a
[1, 2, 3, 4, 5] # b
3、自定义排序方式及参数详解
以下参数对sort和sorted用法及含义都一样。
key
这两种排序都是通过key这个参数来指向排序方式的。
# -*- coding: utf-8 -*-
def my_sort(data):
return data.get('num')
if __name__ == '__main__':
a = [
{'num': 10, 'date': '2017-10-01'},
{'num': 9, 'date': '2017-10-02'},
{'num': 12, 'date': '2017-10-03'}
]
print '1: ', sorted(a, key=my_sort) # TODO
# print 'sorted a: ', sorted(a, key=lambda data: data.get('num')) # 排序方式简单可采用匿名函数方式, 含义同上
print '2: ', a
a.sort(key=my_sort)
print '3 : ', a
输出:
1: [{'date': '2017-10-02', 'num': 9}, {'date': '2017-10-01', 'num': 10}, {'date': '2017-10-03', 'num': 12}]
2: [{'date': '2017-10-01', 'num': 10}, {'date': '2017-10-02', 'num': 9}, {'date': '2017-10-03', 'num': 12}]
3: [{'date': '2017-10-02', 'num': 9}, {'date': '2017-10-01', 'num': 10}, {'date': '2017-10-03', 'num': 12}]
key指向一个函数,可以是普通函数也可以是匿名函数。而这个指向的函数的参数就是列表的一个元素,排序的结果就是根据每次这个函数的返回值进行排的。
以上面的 TODO 例子说明, 列表a进行迭代:
第一次传入 {'num': 10, 'date': '2017-10-01'} ,my_sort 返回 10
第二次传入 {'num': 9, 'date': '2017-10-02'} ,my_sort 返回 9
第三次传入 {'num': 12, 'date': '2017-10-03'} ,my_sort 返回 12
然后根据10,9, 12 对列表a进行排序,得到最后的结果。
reverse
反序
a = [3, 4, 1, 2, 5]
print sorted(a)
>>> [1, 2, 3, 4, 5]
print sorted(a, reverse=True)
>>> [5, 4, 3, 2, 1]
cmp
两个元素的比较函数。python3中已经移除,并且,key参数基本替代cmp。
特别补充:
sorted 对 dict排序:返回的是一个元素为元祖的列表
a = {'time1': '2017-00-01 12:12:12', 'time2': '2017-01-01 12:12:12'}
print sorted(a.items(), key=lambda item: item[1], reverse=True)
>>> [('time2', '2017-01-01 12:12:12'), ('time1', '2017-00-01 12:12:12')] # 注意这里的格式