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 '''
python中sorted如何使用
最新推荐文章于 2022-04-08 20:05:06 发布