Python字典的排序方法,你用對了嗎

2021-10-22 15:40:59 字數 4574 閱讀 1948

摘要:排序是個古老的話題,不過對於字典的排序,常常會讓 小白手足無措。好像沒有找到可以排序字典的函式呢!到底是按key排序,還是按value排序呢?字典到底可不可以按value排序呢?排完序後,還可以通過key檢索嗎?當然,還會丟擲很多問題,而本文將完美地給出了這些問題的答案!

字典是python語言中的一種資料結構,每乙個字典元素是由一對key-value組成的。而字典的key和value分別以集合(set)形似組織,以便快速查詢。集合的儲存形似通常是樹的結構,所以搜尋非常快。我們可以單獨通過字典的keys方法和values方法獲取鍵集合和值集合的可迭代物件,**如下:

x =

print

(x.keys())

print

(x.values(

))

執行這段**,會輸出如下的內容:

dict_keys(

['x'

,'a'

,'b'])

dict_values([20

,12,5

])

ps:dict_keysdict_values是python的兩個內部類,他們都採用了樹的結構對資料進行組織。

現在的問題是,集合是無序的(因為是以樹狀結構儲存的),但由於某些要求,我們期望得到有序的鍵值,這就引出了下面的幾個問題:

q1:集合可以排序嗎?

q2:排序後,可以獲取成對的key-value嗎?

q3:除了按鍵值排序,可以按值排序嗎?

為了回答這幾個問題,請繼續看下面的內容。

1. 集合可以排序嗎?

這個問題的答案是:no。既然稱為集合,由於資料儲存形式的原因,肯定是無序的,但我們可以做乙個折中的處理。既然集合不能排序,那麼可以將集合中的資料排序後,放到乙個可以排序的資料結構(例如,列表)裡,這樣可以在一定程度上解決我們的問題。

看下面的**:

'''

'''x =

keys =

sorted

(x.keys())

values =

sorted

(x.values())

print

(type

(keys)

)print

(type

(values)

)print

(keys)

print

(values)

在這段**中,使用了sorted函式,該函式可以用於對序列進行排序,並將排序結果放到乙個列表中,最後返回這個列表,所以執行這段**,會輸出如下的內容:

<

class

'list'

>

<

class

'list'

>

['a'

,'b'

,'x'][

5,12,

20]

現在我們的第乙個問題解決了,使用sorted函式,將集合按公升序排列,並以列表形式體現。如果想降序排列,那麼需要將reverse引數設定為true,**如下:

keys =

sorted

(x.keys(

), reverse=

true

)values =

sorted

(x.values(

), reverse=

true

)

2. 排序後,可以獲取成對的key-value嗎?

現在來解決第2個問題。本文討論的是字典,所以即使對key和value排序,也不是我們期望的,我們期望的是得到字典中的key-value對,而且是已經排序好的key-value對。

這個問題也非常好解決,既然已經得到了排好序的key,那麼就利用key從字典中獲得對應的value,這樣就可以組成一對key-value了,**如下:

'''

'''x =

keys =

sorted

(x.keys())

for key in keys:

print

(f":"

)

執行這段**,會輸出如下的內容:

x:

20b:5a:

12

很明顯,輸出的key-value對是按key公升序排列的。

3. 除了按鍵值排序,可以按值排序嗎?

那值排序是沒問題的,但排好序的值是沒什麼用的。因為字典並不能通過value反向獲取key。所以通過前面的方法只能獲取排好序的值。所以需要為sorted函式的key引數,該引數用於指定使用key還是value進行排序。如果使用的是python 3.7或以上版本。可以為key引數值指定lambda表示式,**如下:

y1 =

print

(y1)

# 按值降序排列

y2 =

print

(y2)

這段**使用了for-in表示式生成了字典,其中x是待排序的字典。items獲取了key-value對。而lambda表示式的item就是當前的key-value對。item[0]表示key,item[1]表示value,所以使用item[1],就表示按value排序,而使用item[0],就是按key排序。

執行這段**,會輸出如下的結果:

如果不想使用for-in表示式,也可以使用dict函式,**如下:

print

(dict

(sorted

(x.items(

), key=

lambda item: item[1]

)))

如果不想使用lambda表示式,或需要更複雜的排序規則,可以自定義排序規則函式,**如下:

def

dict_val

(x):

return x[1]

sorted_x =

sorted

(x.items(

), key=dict_val)

如果讀者用的是3.6或以下版本的python,可以使用下面的**:

'''

'''import operator

# 按value

sorted_x =

sorted

(x.items(

), key=operator.itemgetter(1)

)print

(type

(sorted_x)

)# list

print

(sorted_x)

# 所以用列表替代

import operator

# 按key

sorted_x =

sorted

(x.items(

), key=operator.itemgetter(0)

)print

(sorted_x)

在這段**中,會返回排好序的列表,列表元素是元組形式,第1個值是key,第2個值是value。當然,你可以將這些資料重新插入新的字典中。執行這段**,會輸出如下內容:

[

('b',5

),('a',12

),('x',20

)][(

'a',12)

,('b',5)

,('x',20)

]

如果仍然想通過key搜尋字典中的value,可以利用ordereddict物件將sorted_x轉換為有序字典,**如下:

'''

'''import collections

sorted_dict = collections.ordereddict(sorted_x)

print

(type

(sorted_dict)

)print

(sorted_dict)

print

(sorted_dict.get(

'b')

)

執行這段**,會輸出如下內容:

<

class

'collections.ordereddict'

>

ordereddict([(

'a',12)

,('b',5)

,('x',20)

])5

總結:本文的核心就是sorted函式,通過這個函式,既可以對key和value集合進行排序,也可以對key-value對進行排序,如果是後者,需要通過key指定到底是用key,還是用value排序,sorted函式返回的是排好序的列表,如果要得到排好序的字典,或者使用for-in表示式處理,或者使用dict函式轉換。當然,如果只是想通過key搜尋value,也可以將資料放到ordereddict物件中。

Python中最快的字典排序方法

def sbv0 adict,reverse false proposed at digital sanitation engineering return sorted adict.iteritems key lambda k,v v,k reverse reverse defsbv1 d,rev...

Python字典按值排序的方法

python字典按值排序的方法 法1 預設公升序排序,加reverse true指定為降序排序 sorted的結果是乙個list dic1sortlist sorted dic1.items key lambda x x 1 reverse true 法2 import operator sorte...

Python 字典的排序

在做 google python exercises 中 basic wordcount.py 這個練習的時候,遇到了乙個關於字典排序的問題。其實很簡單,但是當時做的時候想了好久才找到思路 初學者嘛 於是想把這個問題記錄下來。假設有如下字典 字典的鍵稱作 word,其值稱作 count word c...