Python中sort和sorted函数代码解析,pythonsorted

by admin on 2019年9月3日

Python中利用sorted()函数排序的简单教程,pythonsorted

排序算法

排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x
< y,则返回-1,如果认为x == y,则返回0,如果认为x >
y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

Python内置的sorted()函数就可以对list进行排序:

>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]

此外,sorted()函数也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。比如,如果要倒序排序,我们就可以自定义一个reversed_cmp函数:

def reversed_cmp(x, y):
  if x > y:
    return -1
  if x < y:
    return 1
  return 0

传入自定义的比较函数reversed_cmp,就可以实现倒序排序:

>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

我们再看一个字符串排序的例子:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

默认情况下,对字符串排序,是按照ASCII的大小比较的,由于’Z’ <
‘a’,结果,大写字母Z会排在小写字母a的前面。

现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:

def cmp_ignore_case(s1, s2):
  u1 = s1.upper()
  u2 = s2.upper()
  if u1 < u2:
    return -1
  if u1 > u2:
    return 1
  return 0

忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

这样,我们给sorted传入上述比较函数,即可实现忽略大小写的排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
['about', 'bob', 'Credit', 'Zoo']

从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。

排序算法
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核…

Python中sort和sorted函数代码解析,pythonsorted

本文研究的主要是Python中sort和sorted函数的相关内容,具体如下。

一、sort函数

sort函数是序列的内部函数

函数原型:

L.sort(cmp=None, key=None, reverse=False)

函数作用:

它是把L原地排序,也就是使用后并不是返回一个有序的序列副本,而是把当前序列变得有序

参数说明:

(1) cmp参数

cmp接受一个函数,拿整形举例,形式为:

def f(a,b):
   return a-b

如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了

(2) key参数

key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下

def f(a):
   return len(a)

key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序

(3) reverse参数

接受False 或者True 表示是否逆序

sort举例:

(1)按照元素长度排序

L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f(x):
  return len(x)
sort(key=f)
print L

输出:

[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]

(2)按照每个字典元素里面key为1的元素的值排序

L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f2(a,b):
  return a[1]-b[1]
L.sort(cmp=f2)
print L

输出:

[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]

二、sorted函数

sorted函数是内建函数,他接受一个序列,返回有序的副本

他与sort的唯一区别就是会返回副本

总结

以上就是本文关于Python sort
sorted函数代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

本文研究的主要是Python中sort和sorted函数的相关内容,具体如下。
一、sort函数 sort函数是序列的内…

sort() 是Python列表的一个内置的排序方法,list.sort()
方法排序时直接修改原列表,返回None;

  • Python内置的sorted()函数就可以对list进行排序。
  • sorted()函数可对列表可以接收一个key函数来实现自定义的排序。
  • key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
  • 要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True。

Python内置的sorted()函数就可以对list进行排序:

>>>sorted([36, 5, -12, 9, -21])

[-21, -12, 5, 9, 36]

sort()
是Python内置的一个排序函数,它会从一个迭代器返回一个排好序的新列表。

sorted()三个参数,第一个列表,第二个key函数,第三个是否反向排序,后两个参数可缺省。如:

sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)

可以接收一个key函数来实现自定义的排序,key指定的函数将作用于list的每一个元素上,

相比于 sort(),sorted()
使用的范围更为广泛,但是如果不需要保留原列表,sort更有效一点。另外,sort()
只是列表的一个方法,只适用于列表,而sorted()
函数接受一切迭代器,返回新列表。
两者的函数形式分别如下(Python3.5.2):

注意:
  • sorted()函数是一个高阶函数,用sorted()排序的关键在于实现一个映射函数。
  • 默认情况下,对字符串排序,是按照ASCII的大小比较的。

点击进入详细内容

并根据key函数返回的结果进行排序:

>>>sorted([36,5, -12,9, -21], key=abs)

[5,9, -12, -21,36]

sorted(iterable[, key][, reverse]) 
list.sort(*, key=None, reverse=None) 
练习题:

假设我们用一组tuple表示学生名字和成绩:
L = [(‘Bob’, 75), (‘Adam’, 92), (‘Bart’, 66), (‘Lisa’, 88)]
请用sorted()对上述列表分别按:(1)名字排序;(2)按成绩从高到低排序。

#_*_coding:utf-8_*_
L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)] #list中的元素是一个个tuple(元组)
def by_name(t):#传入的参数是tuple
    return t[0] #把tuple中的第一个元素取出来

def by_score(t):#传入的参数是tuple
    return t[-1] #把tuple中的倒数一个元素取出来

print sorted(L,key=by_name)
print sorted(L,key=by_score,reverse=True)

运行结果:

[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]

默认情况下,对字符串排序,是按照ASCII的大小比较的

这两个方法有以下 2 个共同的参数:

反向排序,不必改动key函数,可以传入第三个参数reverse=True。

>>> sorted([36, 5, -12, 9, -21])

[-21, -12, 5, 9, 36]

>>> sorted([36, 5, -12, 9, -21],reverse=True)

[36, 9, 5, -12, -21]

  • key 是带一个参数的函数,返回一个值用来排序,默认为
    None。这个函数只调用一次,所以fast。
  • reverse 表示排序结果是否反转
    看例子:

>>> a = (1,2,4,2,3)   # a 是元组,故不能用sort() 排序
>>> a.sort()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'sort'
>>> sorted(a)    # sorted() 可以为元组排序,返回一个新有序列表
[1, 2, 2, 3, 4]

>>> a=['1',1,'a',3,7,'n']
>>> sorted(a)
[1, 3, 7, '1', 'a', 'n']
>>> a     # sorted() 不改变原列表
['1', 1, 'a', 3, 7, 'n']     
>>> print a.sort()
None
>>> a      # a.sort()直接修改原列表
[1, 3, 7, '1', 'a', 'n']

因此如果实际应用过程中需要保留原有列表,使用 sorted()
函数较为适合,否则可以选 择 sort() 函数,因为 sort()
函数不需要复制原有列表,消耗的内存较少,效率也较高。

sorted()
函数功能非常强大,它可以方便地针对不同的数据结构进行排序,从而满足不同需求。例子如下:

  • 对字典进行排序

>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})     # 根据字典键排序
[1, 2, 3, 4, 5]
>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}.values())    # 根据字典值排序
['A', 'B', 'B', 'D', 'E']
  • 对多维列表排序

>>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10)]
>>> sorted(student_tuples, key = lambda student: student[0]) # 对姓名排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples, key = lambda student: student[2])  # 年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  • 调用operator模块中的 itemgetter() 可以实现根据多个参数排序:

>>> sorted(student_tuples, key = itemgetter(2))  # 根据年龄排序
[('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_tuples, key = itemgetter(1, 2), reverse=True) # 反转排序结果
[('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]

ps: itemgetter 返回一个函数,实现取元素的功能。比如
f = itemgetter(2),调用 f(r) 返回 r[2];
f = itemgetter(2, 5, 3),调用 f(r) 返回元组 (r[2], r[5], r[3]).

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图