经常需要对元组或者字典等序列按照特定的规则进行排序,
如按照年龄进行排序
>>> 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)]
上面显示的键功能模式非常普遍,因此Python提供了便利功能,使访问器功能更容易,更快捷。
操作员模块具有itemgetter,attrgetter,并且从Python 2.6开始具有methodcaller函数。
使用这些功能,以上示例变得更加简单和快捷。
>>> from operator import itemgetter, attrgetter, methodcaller
>>> 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)]
操作员模块功能允许进行多个级别的排序。
例如,要按年级然后按年龄排序:
>>> 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)]
在下面的示例中,使用了操作员模块的第三个函数methodcaller,其中在对每个学生进行排序之前显示了每个学生的加权成绩:
>>> [(student.name, student.weighted_grade()) for student in student_objects]
[('john', 0.13333333333333333), ('jane', 0.08333333333333333), ('dave', 0.1)]
>>> sorted(student_objects, key=methodcaller('weighted_grade'))
[('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]
list.sort()和sorted()都接受带有布尔值的反向参数。
这用于标记降序排序。
例如,要以相反的年龄顺序获取学生数据:
>>> 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)]
从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)]
在Py3.0中,完全删除了cmp参数(这是简化和统一语言的较大工作的一部分,从而消除了丰富的比较与__cmp__方法之间的冲突)。
在Py2.x中,sort允许一个可选函数,可以进行比较。该函数应该接受两个参数进行比较,然后返回小于等于的负值,如果相等则返回零,或者返回大于等于的正值。例如,我们可以做:
>>> def numeric_compare(x, y):
return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)