十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
sorted函数python介绍如下
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站建设、成都网站制作、常山网络推广、重庆小程序开发、常山网络营销、常山企业策划、常山品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供常山建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序。
sorted() 函数的基本语法格式如下
list = sorted(iterable, key=None, reverse=False)
其中,iterable 表示指定的序列,key 参数可以自定义排序规则;reverse 参数指定以升序(False,默认)还是降序(True)进行排序。sorted() 函数会返回一个排好序的列表。
注意,key 参数和 reverse 参数是可选参数,即可以使用,也可以忽略。
演示sorted()函数的基本代码用法:
#对列表进行排序
a = [5,3,4,2,1]
print(sorted(a))
#对元组进行排序
a = (5,4,3,1,2)
print(sorted(a))
#字典默认按照key进行排序
a = {4:1,\
5:2,\
3:3,\
2:6,\
1:8}
print(sorted(a.items()))
#对集合进行排序
a = {1,5,3,2,4}
print(sorted(a))
#对字符串进行排序
a = "51423"
print(sorted(a))
python内置关于排序的工具主要有两个一个是列表自带的 sort() 方法,另外一个是 sorted() 函数。Python 列表内置方法可以直接修改列表。而 sorted() 内置函数从一个可迭代对象(列表,元组等都可以)构建一个新的排序列表。其函数原型分别如下:
对列表进行默认排序
从函数原型来看,可以看到两者都具有两个可选参数,它们都必须指定为关键字参数。
key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。默认值为 None (直接比较元素)。 key 形参的值应该是个函数(或其他可调用对象),它接受一个参数并返回一个用于排序的键。
假设有其他类型的变量,比如一个自定义的类或者列表中又是一个列表。以官网例子为例有这样一个列表,其元素为元组,
可以用以下方式按照年龄排序
类似的有自定义类
可以用如下方式进行排序
也可以显示定义一个函数,且只有一个参数,返回用于排序的键,比如
总之就是定义一个函数返回一个用于排序的键,可以用lambda函数或者 def 定义都可以。
上面实现的简单函数实际就是实现了返回一个有序结构的第 n 的元素,或者某个类中的某个属性,因此 Python 提供了便利功能,使访问器功能更容易,更快捷。operator 模块有 itemgetter() 、 attrgetter() 函数。分别完成返回第 n 个元素,某个属性功能。上面的排序可以用如下方式进行实现
在python2中,sort有一个 cmp 参数,即用一个函数来自定义比较,在python3中这种方式被取消。为了继承类似的用法,在 Python 3.2 中, functools.cmp_to_key() 函数被添加到标准库中的 functools 模块中。
这种作用先定义如何比较两个变量,以上面的学生列表按照年龄排序为例
这种做法自定义比较函数接收两个形参,返回比较结果(bool),而新式方法接受一个参数,返回的是比较的键。
假设有字典 d = {'b':2, 'a':1,'c':8,'d':4} ,则可以通过以下方式对字典按照键和值进行排序
很多时候,我们需要对List进行排序,Python提供了两个方法,对给定的List
L进行排序:
方法1.用List的成员函数sort进行排序
方法2.用built-in函数sorted进行排序(从2.4开始)
这两种方法使用起来差不多,以第一种为例进行讲解:
从Python2.4开始,sort方法有了三个可选的参数,Python
Library
Reference里是这样描述的
复制代码代码如下:
cmp:cmp
specifies
a
custom
comparison
function
of
two
arguments
(iterable
elements)
which
should
return
a
negative,
zero
or
positive
number
depending
on
whether
the
first
argument
is
considered
smaller
than,
equal
to,
or
larger
than
the
second
argument:
"cmp=lambda
x,y:
cmp(x.lower(),
y.lower())"
key:key
specifies
a
function
of
one
argument
that
is
used
to
extract
a
comparison
key
from
each
list
element:
"key=str.lower"
reverse:reverse
is
a
boolean
value.
If
set
to
True,
then
the
list
elements
are
sorted
as
if
each
comparison
were
reversed.In
general,
the
key
and
reverse
conversion
processes
are
much
faster
than
specifying
an
equivalent
cmp
function.
This
is
because
cmp
is
called
multiple
times
for
each
list
element
while
key
and
reverse
touch
each
element
only
once.
以下是sort的具体实例。
实例1:
复制代码代码如下:
L
=
[2,3,1,4]
L.sort()
L
[1,2,3,4]
实例2:
复制代码代码如下:
L
=
[2,3,1,4]
L.sort(reverse=True)
L
[4,3,2,1]
实例3:
复制代码代码如下:
L
=
[('b',2),('a',1),('c',3),('d',4)]
L.sort(cmp=lambda
x,y:cmp(x[1],y[1]))
L
[('a',
1),
('b',
2),
('c',
3),
('d',
4)]
实例4:
复制代码代码如下:
L
=
[('b',2),('a',1),('c',3),('d',4)]
L.sort(key=lambda
x:x[1])
L
[('a',
1),
('b',
2),
('c',
3),
('d',
4)]
实例5:
复制代码代码如下:
L
=
[('b',2),('a',1),('c',3),('d',4)]
import
operator
L.sort(key=operator.itemgetter(1))
L
[('a',
1),
('b',
2),
('c',
3),
('d',
4)]
实例6:(DSU方法:Decorate-Sort-Undercorate)
复制代码代码如下:
L
=
[('b',2),('a',1),('c',3),('d',4)]
A
=
[(x[1],i,x)
for
i,x
in
enumerate(L)]
#i
can
confirm
the
stable
sort
A.sort()
L
=
[s[2]
for
s
in
A]
L
[('a',
1),
('b',
2),
('c',
3),
('d',
4)]
以上给出了6中对List排序的方法,其中实例3.4.5.6能起到对以List
item中的某一项
为比较关键字进行排序.
效率比较:
复制代码代码如下:
cmp
DSU
key
通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当
多关键字比较排序:
实例7:
复制代码代码如下:
L
=
[('d',2),('a',4),('b',3),('c',2)]
L.sort(key=lambda
x:x[1])
L
[('d',
2),
('c',
2),
('b',
3),
('a',
4)]
我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?有两种方法
实例8:
复制代码代码如下:
L
=
[('d',2),('a',4),('b',3),('c',2)]
L.sort(key=lambda
x:(x[1],x[0]))
L
[('c',
2),
('d',
2),
('b',
3),
('a',
4)]
实例9:
复制代码代码如下:
L
=
[('d',2),('a',4),('b',3),('c',2)]
L.sort(key=operator.itemgetter(1,0))
L
[('c',
2),
('d',
2),
('b',
3),
('a',
4)]
为什么实例8能够工作呢?原因在于tuple是的比较从左到右之一比较的,比较完第一个,如果
相等,比较第二个
列表的sort方法就是用来进行排序的。
主要就是两个参数,key,reverse
先说reverse,这个很简单,就是指出是否进行倒序排序:一般情况下,1排在2的前面,而倒序则相反。
key参数:一般它是一个函数,它接受列表中每一个元素,返回一个可用用于比较的值。
s=[1,2,3,4,5]
s.sort(key=lambda _: _**2%7)
print(s)
输出的是:[1, 3, 4, 2, 5]
如果看不懂lambda表达式,可以看这一段等价的写法:
def myfn(x):
....return (x * x) % 7
s=[1,2,3,4,5]
s.sort(key=myfn)
print(s)
输出的结果是一样的。
key使用的函数可以是自定义函数也可以pytho内置的函数,或者是某个类或者实例的方法,只要它能接受一个参数,返回一个可比较的值即可。比如这样:
s=[[1,2,4],[3,3,5],[1,1,1],[5,7,9]]
s.sort(key=max) # 直接使用max函数作为排序依据
print(s)
[[1, 1, 1], [1, 2, 4], [3, 3, 5], [5, 7, 9]]