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'}}