用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列,可以在Python的交互环境下查看一下sorted函数的语法定义。
>>> help(sorted)
Help on built-in function sorted in module __builtin__:
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
在sorted函数的形参里出现了cmp=None等字样,这个不是之前的两个星号**的问题,这个是参数预设值问题。这样设计函数的好处是,函数的使用具有多样性,可以根据实际情况使用不同的函数调用方式来完成任务。
1 sorted用法
li = [5,3,1,2,4] ret = sorted(li) print (li) print (ret)
程序运行结果:
[5, 3, 1, 2, 4]
[1, 2, 3, 4, 5]
(1) sorted的reverse的默认值是False例子里sorted(li)并未对reverse设置任何值采用默认值False即升序,如果想逆序排序,在使用sorted函数时就需要明确对reverse进行赋值为True了,从而得到逆序排序,这样sorted函数的使用方式就需要传两个参数了,这样函数使用就有多样性了。
li = [5,3,1,2,4] ret = sorted(li, reverse = True) print (li) print (ret)
程序执行结果:
[5, 3, 1, 2, 4]
[5, 4, 3, 2, 1]
(2)sorted的key形参,参数key官方解释如下"The value of the key parameter should be a function that takes a single argument and returns a key to use for sorting purposes. This technique is fast because the key function is called exactly once for each input record."。中文含义:key 可以接收函数,这个函数只有一个参数,函数本身会在比较排序之前作用于可迭代数据集合的每个元素项,函数的返回值作为排序依据,意思有点像数据库的键的概念。用大白话来说如果sorted所排序的集合的每个元素也是集合,sorted可以依据指定每个元素集合的某元素作为排序的依据。
li = "hello Python, life is short!".split() print (li) ret = sorted(li) print ("key = None", ret) ret = sorted(li, key = lambda x : x[0]) print ("key = x[0]", ret) ret = sorted(li, key = lambda x : x[1]) print ("key = x[1]", ret)
程序执行结果:
['hello', 'Python,', 'life', 'is', 'short!']
key = None ['Python,', 'hello', 'is', 'life', 'short!']
key = x[0] ['Python,', 'hello', 'is', 'life', 'short!']
key = x[1] ['hello', 'short!', 'life', 'is', 'Python,']
第一次使用sorted没有用key,第二次使用sorted使用了key指定key = lambda x : x[0] 啥意思?对于li是个列表(集合),它的每个元素是字符串,也是集合类型,默认对li的排序是比较字符串首字母的大小进行排序,而key = lambda x : x[0] 的出现改变了排序规则,但还以第1个字母为基准进行排序,所以两次都是首字母排序,而第三次使用的sorted排序是以第2字母为机制排序所以后两次的排序结果不一样。
再来一个相似的例子:
li = [(5, "hello"), (3, "python"), (6, "good"), (1, "like")] print (li) ret = sorted(li) print ("key = None", ret) ret = sorted(li, key = lambda x : x[0]) print ("key = x[0]", ret) ret = sorted(li, key = lambda x : x[1]) print ("key = x[1]", ret)
这个例子和上一个例子差别在于li的不同,但排序规则相同,程序执行结果如下,
[(5, 'hello'), (3, 'python'), (6, 'good'), (1, 'like')]
key = None [(1, 'like'), (3, 'python'), (5, 'hello'), (6, 'good')]
key = x[0] [(1, 'like'), (3, 'python'), (5, 'hello'), (6, 'good')]
key = x[1] [(6, 'good'), (5, 'hello'), (1, 'like'), (3, 'python')]
此时的li是元组组成的列表,元组有两个数据项,可以依据元组的第一项数据排序,也可依据字符串的大小关系ret = sorted(li, key = lambda x : x[1])进行排序。