python中sorted如何使用

来源:互联网 发布:数据报表怎么做好看 编辑:程序博客网 时间:2024/05/18 04:55
Python 列表内置了一个 list.sort() 方法在“原地”排序。内置函数 sorted() 从一个可迭代对象返回一个新的排序列表。在本文中,我们探讨了使用Python对数据进行排序的各种技术。排序基础简单的升序排序很容易:只需调用sorted()函数。它返回一个新的排序列表:>>> sorted([5, 2, 3, 1, 4])[1, 2, 3, 4, 5]您还可以使用列表的list.sort()方法。它会原位修改列表(并返回None以避免混淆)。相对于sorted()来说它会不太方便- 但如果你不需要原始列表,它稍微更有效率。>>> a = [5, 2, 3, 1, 4]>>> a.sort()>>> a[1, 2, 3, 4, 5]另一个区别是list.sort()方法仅为列表定义。相比之下,sorted()函数接受任何可迭代对象。>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})[1, 2, 3, 4, 5]Key Functions(Key的使用)从Python 2.4开始,list.sort()和sorted()添加了Key参数来指定要在每个列表上调用的函数元素之前进行比较。例如,下面是一个不区分大小写的字符串比较:>>> sorted("This is a test string from Andrew".split(), key=str.lower)['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']Key参数的值应为接受单个参数并返回键以用于排序目的的函数。这种技术是快速的,因为对于每个输入记录精确地调用一次键功能。一个常见的模式是使用一些对象的索引作为键对复杂对象进行排序。例如:>>> student_tuples = [    ('john', 'A', 15),    ('jane', 'B', 12),    ('dave', 'B', 10),]>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]相同的技术适用于具有命名属性的对象。例如:>>> class Student:        def __init__(self, name, grade, age):            self.name = name # 姓名            self.grade = grade # 年级            self.age = age  #  年龄        def __repr__(self):            return repr((self.name, self.grade, self.age))>>> student_objects = [    Student('john', 'A', 15),    Student('jane', 'B', 12),    Student('dave', 'B', 10),]>>> sorted(student_objects, key=lambda student: student.age)   # 通过年龄从小到大排序[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]Operator Module Functions上面显示的键功能模式是非常常见的,所以Python提供了方便的功能,使访问器功能更容易和更快。运算符模块具有operator.itemgetter(),operator.attrgetter(),并从Python 2.5 a operator.methodcaller()函数开始使用这些函数,上述示例变得更简单和更快:>>> from operator import itemgetter, attrgetter>>>>>> sorted(student_tuples, key=itemgetter(2))[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]>>>>>> sorted(student_objects, key=attrgetter('age'))[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)The operator模块功能允许多级排序。例如,先按年级,然后按年龄进行排序:>>> sorted(student_tuples, key=itemgetter(1,2))[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]>>>>>> sorted(student_objects, key=attrgetter('grade', 'age'))[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]operator.methodcaller()函数使用固定参数为正在排序的每个对象调用方法。例如,str.count()方法可用于通过计算消息中感叹号的数量来计算消息优先级:>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']>>> sorted(messages, key=methodcaller('count', '!'))['standby', 'hurry!', 'immediate!!', 'critical!!!']Ascending and Descending(升序和降序)list.sort()和sorted()接受带有布尔值的reverse参数。这用于标记降序排序。例如,要按照年龄顺序获取学生数据:>>> sorted(student_tuples, key=itemgetter(2), reverse=True)[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]>>> sorted(student_objects, key=attrgetter('age'), reverse=True)[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]Sort Stability and Complex Sorts(排序稳定性和复杂排序)从Python 2.2开始,排序保证稳定。这意味着当多个记录具有相同的键时,它们的原始顺序被保留。>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]>>> sorted(data, key=itemgetter(0))[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]注意blue的两个记录如何保留其原始顺序,以便保证('blue',1)在('blue',2)之前。这个奇妙的属性让你在一系列的排序步骤中构建复杂的排序。例如,要按年级降序排序学生数据,然后按年龄升序,请先按年龄排序,然后使用年级:>>> s = sorted(student_objects, key=attrgetter('age'))     # sort on secondary key>>> sorted(s, key=attrgetter('grade'), reverse=True)       # now sort on primary key, descending[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]Python中使用的imsort算法有效地执行多种排序,因为它可以利用数据集中已存在的任何排序。文档中还有几种已经过时的方法,不再赘余官方网站链接:http://python.usyiyi.cn/translate/python_278/howto/sorting.html'''
0 0
原创粉丝点击