python中三大数据结构,列表、字典、集合,字典是平时处理数据所用到的做多的,以此记录几个字典使用时黑魔法(骚操作)。
有一个原始序列数据:
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. 字典排序
现在需要将 info按照身高进行排序,并输出到一个列表里。当然是选择so strong
的sorted()函数了
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})]
现在需要是需要升高由大到小呢
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强大,不过此处需要注意的是info字典本身并没有发生变化,变化的仅是返回值
2. 字典数据筛选(字典推导式)
现在需要筛选出info中成绩大于等于90的学生信息,这时候就该写一个函数了。
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中有一个叫推导式(划重点)的东西,为何不用呢
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}}
结果一模一样有木有,仅仅一行代码,很强大的推导式。
3. 字典的计算
现在需要取出info中成绩最好和最坏的两名学生,当然不是用目测法。假如1000条数据,我相信目测法还是可以试试的。
还是先用万能的函数吧。
# 函数
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}}
# 列表推导式法
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. 字典的键值翻转(一道经典面试题)
就是将上面info字典中的值(也就是第二层字典)中的键值对调,假如不存在重复键的情况。
# 函数解法
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'}}
再来看看推倒式解法,一句话,有木有很强大
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'}}