介绍
sorted方法用来进行排序操作,如数字,字符串组成的list,根据dict类型的key或者value排序,现将平时使用的sorted的方法和数据类型进行整理。
sorted(iterable[, cmp[, key[, reverse]]])
"""
对一个iterable对象排序,返回一个排序之后的list
@param iterable 可迭代遍历对象
@param cmp 默认None, 自定义的比较函数,2个参数
@param key 默认None, 自定义的函数,1个参数,参数值来源与列表元素
@param reverse 默认False(正序)
@return 返回一个排序之后的list
"""
pass
数据类型
首先自定义object用于后续的比较。定义User,包含name和age两个成员变量
class User(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return repr((self.name, self.age))
list
以list类型的对象作为待排序数据,其中元素为数字,字符串,元组,object分别给出测试样例。
- 简单类型样例
# -*- coding=utf-8 -*-
from operator import itemgetter, attrgetter
def sort_list():
"""
关于list类型的排序操作
"""
# 数值类型
test_list = [1, 2, 19, 30]
print sorted(test_list)
print sorted(test_list, reverse=True)
# 字符串类型
test_list = ["a", "boy", "named", "marvin"]
print sorted(test_list)
print sorted(test_list, reverse=True)
# tuple类型
test_list = [("Up", 0), ("Down", 1), ("Left", 2), ("Right", 3)]
# tuple的index=0处值比较,即"Up","Down"等比较
print sorted(test_list, key=lambda item: item[0])
# tuple的index=1处值比较,即0,1等比较
print sorted(test_list, key=lambda item: item[1])
# tuple的index=1处值比较,itemgetter获取元素1号位置
print sorted(test_list, key=itemgetter(1))
- object类型示例
def sort_list_obj():
"""
object组成的list排序
"""
# 根据User的属性name的值排序
# attrgetter获取元素的属性值
test_list = [User("James", 30), User("Marvin", 28), User("Parke", 40), User("Li", 40)]
print sorted(test_list, key=lambda user: user.name)
print sorted(test_list, key=attrgetter("name"))
# 根据User的属性age的值排序
print sorted(test_list, key=lambda user: user.age)
print sorted(test_list, key=attrgetter("age"))
# 先根据age排序,再根据name排序
print sorted(test_list, key=attrgetter("age", "name"))
if __name__ == "__main__":
print "list sort test.\n--------------------"
sort_list()
print "list of object test.\n--------------------"
sort_list_obj()
- 输出结果
list sort test.
--------------------
[1, 2, 19, 30]
[30, 19, 2, 1]
['a', 'boy', 'marvin', 'named']
['named', 'marvin', 'boy', 'a']
[('Down', 1), ('Left', 2), ('Right', 3), ('Up', 0)]
[('Up', 0), ('Down', 1), ('Left', 2), ('Right', 3)]
[('Up', 0), ('Down', 1), ('Left', 2), ('Right', 3)]
list of object test.
--------------------
[('James', 30), ('Li', 40), ('Marvin', 28), ('Parke', 40)]
[('James', 30), ('Li', 40), ('Marvin', 28), ('Parke', 40)]
[('Marvin', 28), ('James', 30), ('Parke', 40), ('Li', 40)]
[('Marvin', 28), ('James', 30), ('Parke', 40), ('Li', 40)]
[('Marvin', 28), ('James', 30), ('Li', 40), ('Parke', 40)]
dict
以dict类型的对象作为待排序数据,其中元素为数字,字符串,元组,对象分别给出测试样例。
- 简单对象示例
def sort_map():
"""
map类型的排序操作
"""
# 数值类型
test_map = {1: "a", 2: "boy", 3: "named", 4: "marvin"}
print sorted(test_map)
print sorted(test_map.values())
# 根据value排序
print sorted(test_map.items(), key=lambda item: item[1])
# 根据key排序
print sorted(test_map.items(), key=lambda item: item[0], reverse=True)
# tuple类型
test_map = {1: ("Up", 0), 2: ("Down", 1), 3: ("Left", 2), 4: ("Right", 3)}
print sorted(test_map.items(), key=lambda item: item[1][0])
- object对象示例
def sort_dict_obj():
"""
object组成的dict的value排序
"""
test_map = {1: User("James", 30), 2: User("Marvin", 28), 3: User("Parke", 40), 4: User("Li", 79)}
# 根据value的age排序
print sorted(test_map.items(), key=lambda item: item[1].age)
# 根据value的name排序
print sorted(test_map.items(), key=lambda item: item[1].name)
# 根据key排序
print sorted(test_map.items(), key=lambda item: item[0])
print sorted(test_map.items(), key=itemgetter(0))
# 根据value的age对values排序
print sorted(test_map.values(), key=lambda item: attrgetter("age"))
if __name__ == "__main__":
print "map sort test\n--------------------"
sort_map()
print "dict of object test. \n--------------------"
sort_dict_obj()
- 输出结果
map sort test
--------------------
[1, 2, 3, 4]
['a', 'boy', 'marvin', 'named']
[(1, 'a'), (2, 'boy'), (4, 'marvin'), (3, 'named')]
[(4, 'marvin'), (3, 'named'), (2, 'boy'), (1, 'a')]
[(2, ('Down', 1)), (3, ('Left', 2)), (4, ('Right', 3)), (1, ('Up', 0))]
dict of object test.
--------------------
[(2, ('Marvin', 28)), (1, ('James', 30)), (3, ('Parke', 40)), (4, ('Li', 79))]
[(1, ('James', 30)), (4, ('Li', 79)), (2, ('Marvin', 28)), (3, ('Parke', 40))]
[(1, ('James', 30)), (2, ('Marvin', 28)), (3, ('Parke', 40)), (4, ('Li', 79))]
[(1, ('James', 30)), (2, ('Marvin', 28)), (3, ('Parke', 40)), (4, ('Li', 79))]
[('James', 30), ('Marvin', 28), ('Parke', 40), ('Li', 79)]
参考文献
python-2.7.14-docs -> Built-in Functions -> sorted()