sorted函數(shù)python介紹如下
創(chuàng)新互聯(lián)專注于泰州企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城建設(shè)。泰州網(wǎng)站建設(shè)公司,為泰州等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
sorted() 作為?Python?內(nèi)置函數(shù)之一,其功能是對序列(列表、元組、字典、集合、還包括字符串)進(jìn)行排序。
sorted() 函數(shù)的基本語法格式如下
list = sorted(iterable, key=None, reverse=False)
其中,iterable 表示指定的序列,key 參數(shù)可以自定義排序規(guī)則;reverse 參數(shù)指定以升序(False,默認(rèn))還是降序(True)進(jìn)行排序。sorted() 函數(shù)會返回一個(gè)排好序的列表。
注意,key 參數(shù)和 reverse 參數(shù)是可選參數(shù),即可以使用,也可以忽略。
演示sorted()函數(shù)的基本代碼用法:
#對列表進(jìn)行排序
a = [5,3,4,2,1]
print(sorted(a))
#對元組進(jìn)行排序
a = (5,4,3,1,2)
print(sorted(a))
#字典默認(rèn)按照key進(jìn)行排序
a = {4:1,\
5:2,\
3:3,\
2:6,\
1:8}
print(sorted(a.items()))
#對集合進(jìn)行排序
a = {1,5,3,2,4}
print(sorted(a))
#對字符串進(jìn)行排序
a = "51423"
print(sorted(a))
很多時(shí)候,我們需要對List進(jìn)行排序,Python提供了兩個(gè)方法,對給定的List
L進(jìn)行排序:
方法1.用List的成員函數(shù)sort進(jìn)行排序
方法2.用built-in函數(shù)sorted進(jìn)行排序(從2.4開始)
這兩種方法使用起來差不多,以第一種為例進(jìn)行講解:
從Python2.4開始,sort方法有了三個(gè)可選的參數(shù),Python
Library
Reference里是這樣描述的
復(fù)制代碼代碼如下:
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的具體實(shí)例。
實(shí)例1:
復(fù)制代碼代碼如下:
L
=
[2,3,1,4]
L.sort()
L
[1,2,3,4]
實(shí)例2:
復(fù)制代碼代碼如下:
L
=
[2,3,1,4]
L.sort(reverse=True)
L
[4,3,2,1]
實(shí)例3:
復(fù)制代碼代碼如下:
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)]
實(shí)例4:
復(fù)制代碼代碼如下:
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)]
實(shí)例5:
復(fù)制代碼代碼如下:
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)]
實(shí)例6:(DSU方法:Decorate-Sort-Undercorate)
復(fù)制代碼代碼如下:
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排序的方法,其中實(shí)例3.4.5.6能起到對以List
item中的某一項(xiàng)
為比較關(guān)鍵字進(jìn)行排序.
效率比較:
復(fù)制代碼代碼如下:
cmp
DSU
key
通過實(shí)驗(yàn)比較,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相當(dāng)
多關(guān)鍵字比較排序:
實(shí)例7:
復(fù)制代碼代碼如下:
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)]
我們看到,此時(shí)排序過的L是僅僅按照第二個(gè)關(guān)鍵字來排的,如果我們想用第二個(gè)關(guān)鍵字
排過序后再用第一個(gè)關(guān)鍵字進(jìn)行排序呢?有兩種方法
實(shí)例8:
復(fù)制代碼代碼如下:
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)]
實(shí)例9:
復(fù)制代碼代碼如下:
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)]
為什么實(shí)例8能夠工作呢?原因在于tuple是的比較從左到右之一比較的,比較完第一個(gè),如果
相等,比較第二個(gè)
1、首先我們定義一個(gè)列表輸入一串大小不一的數(shù)字。
2、可以用sort()方法對定義的列表排序,注意,sort只是對列表排序,它沒有返回一個(gè)值。
3、輸入print列表名即可得到排序后的列表數(shù)據(jù)。
4、倒序可以用這個(gè)reverse方法,把元素位置倒轉(zhuǎn)過來。
5、然后再次print列表名,這樣就會得到倒轉(zhuǎn)順序之后的列表數(shù)據(jù)。
5、如圖兩相對比即實(shí)現(xiàn)了從高到低和從低到高排序。
進(jìn)行一個(gè)簡單的升序排列直接調(diào)用sorted()函數(shù),函數(shù)將會返回一個(gè)排序后的列表:
sorted函數(shù)不會改變原有的list,而是返回一個(gè)新的排好序的list
如果你想使用就地排序,也就是改變原list的內(nèi)容,那么可以使用list.sort()的方法,這個(gè)方法的返回值是None。
另一個(gè)區(qū)別是,list.sort()方法只是list也就是列表類型的方法,只可以在列表類型上調(diào)用。而sorted方法則是可以接受任何可迭代對象。
list.sort()和sorted()函數(shù)都有一個(gè)key參數(shù),可以用來指定一個(gè)函數(shù)來確定排序的一個(gè)優(yōu)先級。比如,這個(gè)例子就是根據(jù)大小寫的優(yōu)先級進(jìn)行排序:
key參數(shù)的值應(yīng)該是一個(gè)函數(shù),這個(gè)函數(shù)接受一個(gè)參數(shù)然后返回以一個(gè)key,這個(gè)key就被用作進(jìn)行排序。這個(gè)方法很高效,因?yàn)閷τ诿恳粋€(gè)輸入的記錄只需要調(diào)用一次key函數(shù)。
一個(gè)常用的場景就是當(dāng)我們需要對一個(gè)復(fù)雜對象的某些屬性進(jìn)行排序時(shí):
再如:
前面我們看到的利用key-function來自定義排序,同時(shí)Python也可以通過operator庫來自定義排序,而且通常這種方法更好理解并且效率更高。
operator庫提供了 itemgetter(), attrgetter(), and a methodcaller()三個(gè)函數(shù)
同時(shí)還支持多層排序
list.sort()和sorted()都有一個(gè)boolean類型的reverse參數(shù),可以用來指定升序和降序排列,默認(rèn)為false,也就是升序排序,如果需要降序排列,則需將reverse參數(shù)指定為true。
排序的穩(wěn)定性指,有相同key值的多個(gè)記錄進(jìn)行排序之后,原始的前后關(guān)系保持不變
我們可以看到python中的排序是穩(wěn)定的。
我們可以利用這個(gè)穩(wěn)定的特性來進(jìn)行一些復(fù)雜的排序步驟,比如,我們將學(xué)生的數(shù)據(jù)先按成績降序然后年齡升序。當(dāng)排序是穩(wěn)定的時(shí)候,我們可以先將年齡升序,再將成績降序會得到相同的結(jié)果。
傳統(tǒng)的DSU(Decorate-Sort-Undecorate)的排序方法主要有三個(gè)步驟:
因?yàn)樵M是按字典序比較的,比較完grade之后,會繼續(xù)比較i。
添加index的i值不是必須的,但是添加i值有以下好處:
現(xiàn)在python3提供了key-function,所以DSU方法已經(jīng)不常用了
python2.x版本中,是利用cmp參數(shù)自定義排序。
python3.x已經(jīng)將這個(gè)方法移除了,但是我們還是有必要了解一下cmp參數(shù)
cmp參數(shù)的使用方法就是指定一個(gè)函數(shù),自定義排序的規(guī)則,和java等其他語言很類似
也可以反序排列
python3.x中可以用如下方式:
分享題目:編寫排序函數(shù)python python排序函數(shù)代碼
本文網(wǎng)址:http://chinadenli.net/article18/doeigdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信公眾號、全網(wǎng)營銷推廣、網(wǎng)站策劃、靜態(tài)網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)