Python—字典黑魔法

python中三大數(shù)據(jù)結(jié)構(gòu),列表、字典、集合,字典是平時(shí)處理數(shù)據(jù)所用到的做多的,以此記錄幾個(gè)字典使用時(shí)黑魔法(騷操作)。

有一個(gè)原始序列數(shù)據(jù):

info = {
     "info1":
         {"name": "Limin", "age": 20, "height": 176, "score": 90},
     "info2":
         {"name": "jenny", "age": 14, "height": 140, "score": 98},
     "info3":
         {"name": "tonya", "age": 26, "height": 180, "score": 82},
     "info4":
         {"name": "suyoo", "age": 22, "height": 165, "score": 89},
     }

1. 字典排序
現(xiàn)在需要將 info按照身高進(jìn)行排序,并輸出到一個(gè)列表里。當(dāng)然是選擇so strong
sorted()函數(shù)了

In [2]: info                                                                                                                                                                                                     
Out[2]: 
{'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
 'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
 'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82},
 'info4': {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}}

In [3]: sorted(info.items(), key=lambda x: x[1]['height'])                                                                                                                                                       
Out[3]: 
[('info2', {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98}),
 ('info4', {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}),
 ('info1', {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90}),
 ('info3', {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82})]

現(xiàn)在需要是需要升高由大到小呢

In [4]: sorted(info.items(), key=lambda x: x[1]['height'], reverse=True)                                                                                                                                         
Out[4]: 
[('info3', {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}),
 ('info1', {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90}),
 ('info4', {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}),
 ('info2', {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98})]

如果不想要infox字樣了呢,so easy

In [5]: sorted(info.values(),key=lambda x:x['height'])                                                                                                                                                           
Out[5]: 
[{'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
 {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89},
 {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
 {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}]

so,可以看到字典暗黑魔法之一的 sorted() 是不是very強(qiáng)大,不過(guò)此處需要注意的是info字典本身并沒(méi)有發(fā)生變化,變化的僅是返回值

2. 字典數(shù)據(jù)篩選(字典推導(dǎo)式)
現(xiàn)在需要篩選出info中成績(jī)大于等于90的學(xué)生信息,這時(shí)候就該寫(xiě)一個(gè)函數(shù)了。

result={}
for key,value in info.items():
    for i,k in value.items():
        if i == "score" and k >= 90:
            result[key]=value
print(result)  
                                                                                                                                                                                            
>>>
{'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
 'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98}}

是不是看似很完美,but,python中有一個(gè)叫推導(dǎo)式(劃重點(diǎn))的東西,為何不用呢

In [9]: info                                                                                                                                                                                                     
Out[9]: 
{'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
 'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
 'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82},
 'info4': {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}}

In [10]: {key:value for key,value in info.items() if value["score"] >= 90}                                                                                                                                       
Out[10]: 
{'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
 'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98}}

結(jié)果一模一樣有木有,僅僅一行代碼,很強(qiáng)大的推導(dǎo)式。

3. 字典的計(jì)算
現(xiàn)在需要取出info中成績(jī)最好和最壞的兩名學(xué)生,當(dāng)然不是用目測(cè)法。假如1000條數(shù)據(jù),我相信目測(cè)法還是可以試試的。
還是先用萬(wàn)能的函數(shù)吧。

# 函數(shù)
result={}
score= [x["score"] for x in info.values()]
for key,value in info.items():
    for i,k in value.items():
        if i == "score" and k in [max(score), min(score)]:
            result[key]=value
print(result)
>>>
{'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
 'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}}

# 列表推導(dǎo)式法
score= [x["score"] for x in info.values()]
print({k:v for k,v in info.items() if v["score"] in [max(score), min(score)]})
>>>
{'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
 'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}}

4. 字典的鍵值翻轉(zhuǎn)(一道經(jīng)典面試題)
就是將上面info字典中的值(也就是第二層字典)中的鍵值對(duì)調(diào),假如不存在重復(fù)鍵的情況。

# 函數(shù)解法
result = {}
for key, value in info.items():
    result1 = {}
    for i,v in value.items():
        result1[i]=v
    result[key] = result1
print(result)

>>>
{'info1': {176: 'height', 20: 'age', 90: 'score', 'Limin': 'name'},
 'info2': {14: 'age', 140: 'height', 98: 'score', 'jenny': 'name'},
 'info3': {180: 'height', 26: 'age', 82: 'score', 'tonya': 'name'},
 'info4': {165: 'height', 22: 'age', 89: 'score', 'suyoo': 'name'}}

再來(lái)看看推倒式解法,一句話,有木有很強(qiáng)大

In [28]: info                                                                                                                                                                                                    
Out[28]: 
{'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
 'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
 'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82},
 'info4': {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}}
In [29]: {k:{i:v for v,i in info[k].items()} for k in info}                                                                                                                                                      
Out[29]: 
{'info1': {176: 'height', 20: 'age', 90: 'score', 'Limin': 'name'},
 'info2': {14: 'age', 140: 'height', 98: 'score', 'jenny': 'name'},
 'info3': {180: 'height', 26: 'age', 82: 'score', 'tonya': 'name'},
 'info4': {165: 'height', 22: 'age', 89: 'score', 'suyoo': 'name'}}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容