Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法實(shí)例
一、實(shí)際場(chǎng)景及解決思路
實(shí)際場(chǎng)景:比如某個(gè)班的數(shù)學(xué)成績(jī)以字典格式存儲(chǔ)為:
student_dict = { 'xiaoliang': 81, 'xiaowang' : 92, 'xiaoxin' : 99, ...... }
實(shí)際字典存儲(chǔ)是隨機(jī)排序的,本文給出根據(jù)每個(gè)學(xué)生的成績(jī)對(duì)學(xué)生字典格式數(shù)據(jù)進(jìn)行排序,并將排序結(jié)果返回給字典中的解決方法。
解決思路:將字典中的元素轉(zhuǎn)換為元組,使用內(nèi)置函數(shù)sorted
排序。由于Python內(nèi)置方法sorted
并不能直接對(duì)字典進(jìn)行操作,所以需要首先將字典格式數(shù)據(jù)轉(zhuǎn)換為元組列表數(shù)據(jù)格式,然后使用sorted
進(jìn)行排序,常用的方法包括三種:
- 方法1:使用列表解析方法實(shí)現(xiàn)
- 方法2(推薦):使用
zip
方法實(shí)現(xiàn) - 方法3(高級(jí)用法):傳遞
sorted
函數(shù)的key
參數(shù)
二、字典排序的三種實(shí)現(xiàn)方法
2.1 使用列表解析方法實(shí)現(xiàn)字典排序
方案1:使用列表解析方法實(shí)現(xiàn)
(1)使用列表解析方法將字典中的像轉(zhuǎn)化為
(value, key)
的元組格式,然后使用sorted
方法實(shí)現(xiàn)排序;
(2)注意:元組比較大小是根據(jù)第一個(gè)元素value
決定的輸出的真假,當(dāng)?shù)谝粋€(gè)元素value
相同時(shí)候,才比較第二個(gè),依次類推。
Python代碼如下所示:
from random import randint # 1.創(chuàng)建一個(gè)包含20個(gè)學(xué)生名及成績(jī)的字典創(chuàng)建方法 student_dict = {'student_%d' % i: randint(50, 100) for i in range(1, 21)} # 2.使用列表解析方法將學(xué)生字典轉(zhuǎn)換為(value, key)的元組格式 student_tuplelist = [(stu_value, stu_key) for stu_key, stu_value in student_dict.items()] # 查看以下轉(zhuǎn)換后的效果 print(student_tuplelist) # 3.使用sorted函數(shù)對(duì)元組列表student_list由分?jǐn)?shù)高低進(jìn)行排序 student_tuplelist_sorted = sorted(student_tuplelist, reverse=True) # 輸出結(jié)果: print(student_tuplelist_sorted)
代碼執(zhí)行結(jié)果如下圖所示:
2.2 使用zip方法實(shí)現(xiàn)字典排序
(1)使用
zip
方法將字典中的像轉(zhuǎn)化為(value, key)
的元組格式,然后使用sorted
方法實(shí)現(xiàn)排序;
(2)注意zip
的輸出為一個(gè)zip對(duì)象(zip object),需要使用列表構(gòu)造器list
才能轉(zhuǎn)換為元組列表;
(3)結(jié)合下圖zip
函數(shù)的功能,使用zip
將學(xué)生字典轉(zhuǎn)換為元組列表的方法為:list(zip(student_dict.values(), student_dict.keys()))
。
Python代碼如下所示:
from random import randint # 1.創(chuàng)建一個(gè)包含20個(gè)學(xué)生名及成績(jī)的字典創(chuàng)建方法 student_dict = {'student_%d' % i: randint(50, 100) for i in range(1, 21)} # 2.使用zip方法將學(xué)生字典轉(zhuǎn)換為(value, key)的元組格式 student_tuplelist = list(zip(student_dict.values(), student_dict.keys())) # 查看以下轉(zhuǎn)換后的效果 print(student_tuplelist) # 3.使用sorted函數(shù)對(duì)元組列表student_list由分?jǐn)?shù)高低進(jìn)行排序 student_tuplelist_sorted = sorted(student_tuplelist, reverse=True) # 輸出結(jié)果: print(student_tuplelist_sorted)
2.3 使用傳遞sorted函數(shù)的key參數(shù)實(shí)現(xiàn)字典排序
(1)由于
sorted
方法有一個(gè)key
參數(shù),它可以指定排序?qū)ο笫前凑兆值淠念愒兀ㄦI值或者值)進(jìn)行排序;
(2)需要注意的是對(duì)于key
參數(shù)我們需要使用lambda
匿名函數(shù)作為迭代器key=lambda x: x[1]
,依次訪問學(xué)生字典的值;sorted
函數(shù)的學(xué)生字典傳入方法為student_dict.items()
。
(3)使用sorted函數(shù)的key參數(shù)對(duì)字典數(shù)據(jù)進(jìn)行排序,代碼顯得更加簡(jiǎn)潔。
Python實(shí)現(xiàn)代碼如下所示:
from random import randint # 1.創(chuàng)建一個(gè)包含20個(gè)學(xué)生名及成績(jī)的字典創(chuàng)建方法 student_dict = {'student_%d' % i: randint(50, 100) for i in range(1, 21)} # 2.傳遞`sorted`函數(shù)的`key`參數(shù)實(shí)現(xiàn)學(xué)生字典數(shù)據(jù)的排序 student_tuplelist_sorted = sorted(student_dict.items(), key=lambda x: x[1], reverse=True) # 3.輸出結(jié)果 print(student_tuplelist_sorted)
三、將sorted排序的列表返回給字典
上面三種方案對(duì)學(xué)生字典數(shù)據(jù)進(jìn)行排序后返回的是一個(gè)元素為元組的列表,而如果我們需要的還是字典格式,可以使用python的內(nèi)置函數(shù)enumerate
實(shí)現(xiàn)。對(duì)返回的元組列表排序結(jié)果使用enumerate
后的輸出為一個(gè)枚舉對(duì)象(enumerate object),結(jié)果如下圖所示:
這里需要使用列表生成器list(enumerate(student_tuplelist_sorted, 1))
讀取其中的元素,其中參數(shù)1
表示初始標(biāo)號(hào)為1,輸出結(jié)果如下圖所示:
由上圖可以看出,enumerate
函數(shù)的輸出元組列表格式為(序號(hào), ('student_x', 考試分?jǐn)?shù)))
。使用for
循環(huán)可以依次讀取enumerate
中的內(nèi)容,并重新構(gòu)建學(xué)生字典。代碼如下所示:
from random import randint # 1.創(chuàng)建一個(gè)包含20個(gè)學(xué)生名及成績(jī)的字典創(chuàng)建方法 student_dict = {'student_%d' % i: randint(50, 100) for i in range(1, 21)} # 2.使用傳遞`sorted`函數(shù)的`key`參數(shù)的方法對(duì)字典進(jìn)行排序 student_tuplelist_sorted = sorted(student_dict.items(), key=lambda x: x[1], reverse=True) # 3.使用for循環(huán)結(jié)合內(nèi)置函數(shù)enumerate重新構(gòu)建排序后的字典: student_dict_sorted = {} for rank, (stu_key, stu_val) in enumerate( student_tuplelist_sorted, 1): # 重新構(gòu)造帶有排名的排序后的學(xué)生字典student_dict_sorted student_dict_sorted[stu_key] = (rank, stu_val) # 4.查看結(jié)果 print("帶有名次的排序后學(xué)生字典:", student_dict_sorted)
代碼執(zhí)行結(jié)果如下圖所示:
總結(jié)
到此這篇關(guān)于Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法的文章就介紹到這了,更多相關(guān)Python根據(jù)字典值對(duì)字典排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Selenium中免登錄的實(shí)現(xiàn)方法option詳解
在selenium中有很多種可以實(shí)現(xiàn)網(wǎng)站的免登錄,option就是其中的一種做法,這篇文章主要介紹了Selenium中免登錄的實(shí)現(xiàn)方法option,需要的朋友可以參考下2022-12-12python?中defaultdict()對(duì)字典進(jìn)行初始化的用法介紹
這篇文章主要介紹了python?中defaultdict()對(duì)字典進(jìn)行初始化,一般情況下,在使用字典時(shí),先定義一個(gè)空字典(如dict_a?=?{}),然后往字典中添加元素只需要?dict_a[key]?=?value即可,本文通過實(shí)例代碼介紹具體用法,需要的朋友可以參考下2022-07-07詳解用Python進(jìn)行時(shí)間序列預(yù)測(cè)的7種方法
這篇文章主要介紹了詳解用Python進(jìn)行時(shí)間序列預(yù)測(cè)的7種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03