python的sorted排序详解

41 篇文章 4 订阅
36 篇文章 1 订阅

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用python的程序员们参考,也让没有使用python的朋友了解python。领略一番“生命有限,请用Python”的含义。


内置函数sorted()/list.sort()的使用


简单应用


python对list有一个内置函数:sorted(),专门用于排序。举例:

>>> a=[5,3,6,1,9,2]
>>> sorted(a)       #a经过sorted之后,得到一个排序结果
[1, 2, 3, 5, 6, 9]  #但是,原有的a并没有受到影响
>>> a
[5, 3, 6, 1, 9, 2]

也可以使用list.sort()来进行上述操作。

>>> a.sort()
>>> a               #注意这里,经过list.sort()之后,原有
[1, 2, 3, 5, 6, 9]  #a的顺序已经发生变化,与上述不同之处。

sorted和list.sort()的区别:list.sort()只能对list类型进行排序。如下:

>>> b_dict={1:'e',3:'m',9:'a',5:'e'}
>>> b_dict.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: 'dict' object has no attribute 'sort'

而sorted则不然,看例子:

>>> b_dict
{1: 'e', 3: 'm', 5: 'e', 9: 'a'}
>>> sorted(b_dict)
[1, 3, 5, 9]

sorted之后,上述对dictinoary中,将key值取出并排序,返回list类型的排序结果。


按照指定关键词排序


在list.sort()和sorted中,都可以根据指定的key值排序。例如:

sorted的例子:

>>> qw="I am Qiwsir you can read my articles im my blog".split()
>>> qw
['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']
>>> sorted(qw,key=str.lower)        #按照字母升序排列
['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

list.sort()的例子:

>>> qw  
['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']
>>> qw.sort(key=str.lower)
>>> qw
['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

此外,key还可以接收函数的单一返回值,按照该值排序。例如:

>>> name_mark_age = [('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]
>>> sorted(name_mark_age, key = lambda x: x[2])     #根据年龄排序
[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16)]

>>> sorted(name_mark_age, key = lambda x: x[1])     #根据等级排序
[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14)]

>>> sorted(name_mark_age, key = lambda x: x[0])     #根据姓名排序
[('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhangsan', 'A', 15)]

除了上述方式,python中还提供了一个选择循环选择指定元组值的模块。官方文档:https://docs.python.org/2/library/operator.html#module-operator

>>> from operator import itemgetter    

>>> name_mark_age
[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(2))     #按照年龄排序
[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(1,2))   #先按照等级排序,相同等级看年龄
[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14), ('zhaoliu', 'B', 16)]

在官方文档上,有这样一个例子,和上面的操作是完全一样的。

>>> 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),       #注意这里,用class Student来生成列表内的值
        Student('jane', 'B', 12),       #因此,可以通过student_objects[i].age来访问某个名称的年龄,i=0,则是john的年龄
        Student('dave', 'B', 10),
        ]

>>> sorted(student_objects, key=lambda student: student.age)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

也可以引用operator模块来实现上述排序

>>>from operator import attrgetter
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

**总结:**sorted的能力超强,不仅实现排序,还能按照指定关键词排序。

以上例子都是升序,如果,增加reverse=True。例如:

>>>from operator import itemgetter 
>>> name_mark_age
[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]
>>> sorted(name_mark_age, key=itemgetter(2),reverse=True)
[('WANGWU', 'A', 16), ('zhaoliu', 'B', 16), ('zhangsan', 'A', 15), ('LISI', 'B', 14)]

sorted的算法


python中的sorted算法,网上有人撰文,说比较低级。其实不然,通过阅读官方文档,发现python中的sorted排序,真的是高大上,用的Timsort算法。什么是Timsort,请看 wiki的解释:http://en.wikipedia.org/wiki/Timsort,另外,国内有一个文档,适当翻译:http://blog.csdn.net/yangzhongblog/article/details/8184707,这里截取一个不同排序算法比较的图示,就明白sorted的威力了。

从时间复杂度来看,Timsort是威武的。

从空间复杂度来讲,需要的开销在数量大的时候会增大。

综上,可以看出,就一般情况,使用sorted足以能够完成排序的要求,并且是稳定的。

当然,python中也有其它一些排序模块,都可以直接拿过来使用。

本文作者在博客和github上都有多种关于python排序方法和模块的文章说明。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python sorted函数可以用来对列表进行排序,它接收一个可迭代对象作为参数,返回排序后的新列表。示例如下:myList = [3, 8, 5, 1, 9] sortedList = sorted(myList)# sortedList = [1, 3, 5, 8, 9] ### 回答2: Python中的sorted函数是一个非常有用的函数,它用于对可迭代对象进行排序操作。sorted函数可以接受一个可迭代对象作为参数,并返回一个经过排序的新的列表。 sorted函数的基本用法是sorted(iterable, key=None, reverse=False)。其中,iterable表示要排序的可迭代对象,key表示排序的基准,reverse表示排序的顺序。 如果不指定key参数,则sorted函数将按照默认的排序方式进行排序。默认情况下,sorted函数会将可迭代对象中的元素按照从小到大的顺序进行排序。如果可迭代对象中的元素是字符串,那么按照字母的顺序进行排序。 如果想要按照其他的排序方式进行排序,可以使用key参数。key参数接受一个函数作为参数,这个函数将会在排序时作为排序的依据。例如,如果想要按照元素的长度进行排序,可以将len函数作为key参数传入。 另外,reverse参数可以用来控制排序的顺序。如果reverse=True,那么排序的结果将会按照从大到小的顺序排列。 除了传统的列表排序外,sorted函数还可以对字符串进行排序。当对字符串进行排序时,默认情况下会按照字母的顺序进行排序。如果希望使用其他排序方式,仍然可以使用key参数进行指定。 需要注意的是,sorted函数会返回一个新的排序后的列表,原来的可迭代对象不会被改变。如果需要对原来的列表进行排序,可以使用sort方法。 综上所述,Pythonsorted函数是一个用于排序的强大工具,它可以对可迭代对象进行排序,并且可以通过key和reverse参数来控制排序的方式和顺序。它的灵活性和易用性使得它在实际的开发中得到了广泛的应用。 ### 回答3: Python中的sorted函数是一个内置函数,用于对可迭代对象进行排序操作。它接受一个可迭代对象作为参数,并返回一个新的已排序的列表。 sorted函数的基本语法如下: sorted(iterable, key, reverse) 其中,iterable参数是表示可迭代对象的集合,如列表、元组或字符串等。key参数是一个可选的函数,用于指定排序的键。reverse参数是一个可选的布尔值,默认为False,表示升序排列;如果设为True,则表示降序排列。 示例如下: ``` numbers = [5, 2, 8, 1, 7] sorted_numbers = sorted(numbers) print(sorted_numbers) ``` 输出结果为:[1, 2, 5, 7, 8] 在上面的示例中,我们传入了一个列表numbers给sorted函数进行排序。返回结果sorted_numbers是一个新的已排序的列表。 我们也可以指定reverse参数来改变排序的顺序: ``` numbers = [5, 2, 8, 1, 7] sorted_numbers = sorted(numbers, reverse=True) print(sorted_numbers) ``` 输出结果为:[8, 7, 5, 2, 1] 在这个例子中,我们将reverse参数设为True,使得sorted函数按降序排列。 此外,我们还可以使用key参数来指定一个函数,根据函数的返回值进行排序: ``` fruits = ['apple', 'banana', 'cherry', 'date'] sorted_fruits = sorted(fruits, key=len) print(sorted_fruits) ``` 输出结果为:['date', 'apple', 'cherry', 'banana'] 在这个例子中,我们使用key=len来指定一个函数,表示根据字符串的长度进行排序,从而得到按字符串长度升序排列的结果。 总而言之,Pythonsorted函数是一个非常有用的工具,它可以帮助我们对可迭代对象进行排序操作。我们可以根据需要指定排序的顺序和规则,从而得到我们想要的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiwsir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值