python中有兩種排序方法,list內(nèi)置sort()方法或者python內(nèi)置的全局sorted()方法
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計(jì),江陰網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:江陰等地區(qū)。江陰做網(wǎng)站價(jià)格咨詢:18980820575
二者區(qū)別為:
sort()方法對(duì)list排序會(huì)修改list本身,不會(huì)返回新list。sort()只能對(duì)list進(jìn)行排序。
sorted()方法會(huì)返回新的list,保留原來(lái)的list。sorted 可以對(duì)所有可迭代的對(duì)象進(jìn)行排序操作。
列表的sort方法就是用來(lái)進(jìn)行排序的。
主要就是兩個(gè)參數(shù),key,reverse
先說(shuō)reverse,這個(gè)很簡(jiǎn)單,就是指出是否進(jìn)行倒序排序:一般情況下,1排在2的前面,而倒序則相反。
key參數(shù):一般它是一個(gè)函數(shù),它接受列表中每一個(gè)元素,返回一個(gè)可用用于比較的值。
s=[1,2,3,4,5]
s.sort(key=lambda _: _**2%7)
print(s)
輸出的是:[1, 3, 4, 2, 5]
如果看不懂lambda表達(dá)式,可以看這一段等價(jià)的寫法:
def myfn(x):
....return (x * x) % 7
s=[1,2,3,4,5]
s.sort(key=myfn)
print(s)
輸出的結(jié)果是一樣的。
key使用的函數(shù)可以是自定義函數(shù)也可以pytho內(nèi)置的函數(shù),或者是某個(gè)類或者實(shí)例的方法,只要它能接受一個(gè)參數(shù),返回一個(gè)可比較的值即可。比如這樣:
s=[[1,2,4],[3,3,5],[1,1,1],[5,7,9]]
s.sort(key=max)? # 直接使用max函數(shù)作為排序依據(jù)
print(s)
[[1, 1, 1], [1, 2, 4], [3, 3, 5], [5, 7, 9]]
列表中的數(shù)據(jù)種類很多,有字符串,有整型,有其他列表的嵌套,還有更多的數(shù)據(jù)類型,這些數(shù)據(jù)在列表中往往是錯(cuò)亂的,沒有一定的邏輯關(guān)系,但是我們?cè)谑褂昧斜淼臅r(shí)候往往需要按照一定的邏輯關(guān)系進(jìn)行調(diào)用或檢索。下面就來(lái)看看 列表是如何排序和翻轉(zhuǎn)的 ,所謂翻轉(zhuǎn)也就是把既定列表倒序排列。
返回結(jié)果:
從上面的返回結(jié)果可以看出來(lái),sort()函數(shù)如果遇到字符串是按照首字母順序進(jìn)行排列的,如果遇到浮點(diǎn)型數(shù)據(jù)還是按照大小排列。
由上面的結(jié)果可以看出來(lái),不同的數(shù)據(jù)類型是沒有辦法進(jìn)行排列的。
這個(gè)方法是把原列表中的元素順序從左至右的重新存放,而不會(huì)對(duì)列表中的參數(shù)進(jìn)行排序整理。如果需要對(duì)列表中的參數(shù)進(jìn)行整理,就需要用到列表的另一種排序方式sort正序排序。
很多時(shí)候,我們需要對(duì)List進(jìn)行排序,Python提供了兩個(gè)方法,對(duì)給定的List
L進(jìn)行排序:
方法1.用List的成員函數(shù)sort進(jìn)行排序
方法2.用built-in函數(shù)sorted進(jìn)行排序(從2.4開始)
這兩種方法使用起來(lái)差不多,以第一種為例進(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中對(duì)List排序的方法,其中實(shí)例3.4.5.6能起到對(duì)以List
item中的某一項(xiàng)
為比較關(guān)鍵字進(jìn)行排序.
效率比較:
復(fù)制代碼代碼如下:
cmp
DSU
key
通過(guò)實(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í)排序過(guò)的L是僅僅按照第二個(gè)關(guān)鍵字來(lái)排的,如果我們想用第二個(gè)關(guān)鍵字
排過(guò)序后再用第一個(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è)