python中sorted如何使用


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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值