Python 进价之路 (二) Dict 进价宝典,初二快乐!

48次阅读

共计 4316 个字符,预计需要花费 11 分钟才能阅读完成。

新年快乐
大家好,今天是大年初二,身在国外没有过年的氛围,只能踏实写写文章,对社区做点贡献,在此祝大家新年快乐!上一期为大家梳理了一些 List 的进阶用法,今天我们来看字典 Dict 的相关技巧,我个人在编程中对字典的使用非常频繁,其实对于不是非常大的数据存储需求,字典是一个不错的选择,比 List 要快的多,我在基础篇里面讲过了一些关于 dict 的基础方法,如果没有看过的朋友们可以点击链接 Python 基础起步 (八) 字典实用技巧大全,好啦,闲话少说,现在让我们一起来看看今天的进阶技巧吧~
字典进阶方法汇总
创建字典
这里介绍最常见的几种方式, 直接上例子:
first = {} # 创建空字典
second = dict() # 创建空字典

keys = [‘Name’,’Age’,’Job’,’Salary’]
values = [‘White’,50,’cook’,10000]
third=dict(zip(keys,values)) # Zip 创建

fouth = dict(Name=’White’,Age=50,Job=’cook’,Salary=10000) # 等号创建

fifth = {1: {‘name’: ‘John’, ‘age’: ’27’, ‘sex’: ‘Male’},
2: {‘name’: ‘Marie’, ‘age’: ’22’, ‘sex’: ‘Female’}} # 创建一个嵌套字典

print(first)
print(second)
print(third)
print(fouth)
print(fifth[1])

Out: {}
{}
{‘Name’: ‘White’, ‘Age’: 50, ‘Job’: ‘cook’, ‘Salary’: 10000}
{‘Name’: ‘White’, ‘Age’: 50, ‘Job’: ‘cook’, ‘Salary’: 10000}
{‘name’: ‘John’, ‘age’: ’27’, ‘sex’: ‘Male’}

这里我们可以直接用 {} 或者 dict()创建空的字典,或者直接为字典以 key:value 的形式赋值,Zip 和等号直接赋值也很方便,如果需要多层 nested 也可以很简单的实现,有关创建就说这么多啦
字典排序
有关字典排序,我们有两种选择,第一是根据字典的 key 值排序,第二是根据 Value 值排序,让我们一个个来看,首先让我们新建一个字典用于测试:
final_result= dict(Math=80,Chinese=78,English=96,Science=60,Art=75)
print(final_result.items())

Out: dict_items([(‘Math’, 80), (‘Chinese’, 78), (‘English’, 96), (‘Science’, 60), (‘Art’, 75)])

根据 Key 值排序
这里我们创建一个字典 final_result,key 值是科目的名字,value 值是分数,首先根据 Key 值进行排序,首先让我们根据 Key 值升序,可选的方法很多,比如 sorted, operator, lamba:
print(sorted(final_result.items())) # 根据 key 的值升序
Out:[(‘Art’, 75), (‘Chinese’, 78), (‘English’, 96), (‘Math’, 80), (‘Science’, 60)]

import operator
print(sorted(final_result.items(),key=operator.itemgetter(0)))
Out:[(‘Art’, 75), (‘Chinese’, 78), (‘English’, 96), (‘Math’, 80), (‘Science’, 60)]

print(sorted(final_result.items(),key=lambda x:x[0]))
Out:[(‘Art’, 75), (‘Chinese’, 78), (‘English’, 96), (‘Math’, 80), (‘Science’, 60)]
根据 key 值降序只要加个 reverse=True 就好了,因为 sorted 函数默认 reverse=False,看下结果:
print(sorted(final_result.items(),reverse=True)) # 根据 key 的值降序
Out:[(‘Science’, 60), (‘Math’, 80), (‘English’, 96), (‘Chinese’, 78), (‘Art’, 75)]

import operator
print(sorted(final_result.items(),key=operator.itemgetter(0),reverse=True))
Out:[(‘Science’, 60), (‘Math’, 80), (‘English’, 96), (‘Chinese’, 78), (‘Art’, 75)]

print(sorted(final_result.items(),key=lambda x:x[0],reverse=True))
Out:[(‘Science’, 60), (‘Math’, 80), (‘English’, 96), (‘Chinese’, 78), (‘Art’, 75)]

有关 lamba 函数实在有太多可以总结的,我会在之后专门拿一期来讲,和 filter reduce 简直是神器,当我逐渐使用的多了后终于感受到了一点点 pythonic 的感觉,哈哈
根据 Value 值排序
其实大家看到了根据 key 的排序,也猜到了如何根据 value 排序,让我们先看升序:
print(sorted(final_result.items(),key=lambda x:x[1])) #根据 Value 升序
Out:[(‘Science’, 60), (‘Art’, 75), (‘Chinese’, 78), (‘Math’, 80), (‘English’, 96)]

import operator
print(sorted(final_result.items(),key=operator.itemgetter(1)))

Out:[(‘Science’, 60), (‘Art’, 75), (‘Chinese’, 78), (‘Math’, 80), (‘English’, 96)]

降序也一样,无非就是加上 reverse=True,这里不一一举例了:
print(sorted(final_result.items(),key=lambda v:v[1],reverse=True))
Out:[(‘English’, 96), (‘Math’, 80), (‘Chinese’, 78), (‘Art’, 75), (‘Science’, 60)]
字典合并(Merge)
在 Python 3.5 以上可以直接用 **,是一个常用的小技巧,在此对于 2.7 的用户说一声对不起,技术一直说是喜新厌旧呀,让我们看一个小栗子:
def Merge(dict1, dict2):
res = {**dict1, **dict2}
return res

dict1 = {‘a’: 10, ‘b’: 8,’c’:2}
dict2 = {‘d’: 6, ‘c’: 4}
dict3 = Merge(dict1, dict2)
print(dict3)

Out:{‘a’: 10, ‘b’: 8, ‘c’: 4, ‘d’: 6}

这里顺序很重要,大家一定要看好是谁覆盖了谁,如果我们交换一下顺序就会变成这样:
def Merge(dict1, dict2):
res = {**dict2, **dict1} # 交换了顺序
return res

dict1 = {‘a’: 10, ‘b’: 8,’c’:2}
dict2 = {‘d’: 6, ‘c’: 4}
dict3 = Merge(dict1, dict2)
print(dict3)
Out:{‘d’: 6, ‘c’: 2, ‘a’: 10, ‘b’: 8}

对于 Python2 的朋友们不用担心,自然有解决方案,那就是用 update 函数,也很方便,上代码:
dict1 = {‘a’: 10, ‘b’: 8,’c’:2}
dict2 = {‘d’: 6, ‘c’: 4}

dict2.update(dict1)
print(dict2)

Out:{‘d’: 6, ‘c’: 2, ‘a’: 10, ‘b’: 8}

利用 Json.dumps()美化输出 dict
我们如果碰到以下这种情况的 dict,如果按照常规 print 输出会这样:
my_mapping = {‘a’: 23, ‘b’: 42, ‘c’: 0xc0ffee}
print(my_mapping)
Out:{‘a’: 23, ‘b’: 42, ‘c’: 12648430}

但是如果我们能引用 json 库里的 dumps 方法会得到好的多的效果:
import json
print(json.dumps(my_mapping, indent=4, sort_keys=True))
Out:{
“a”: 23,
“b”: 42,
“c”: 12648430
}

字典参数解包
Python 里面方便神奇的方法很多,比如下面这个,可以实现解包字典:
def unpack(k1,k2,k3):
print(k1,k2,k3)

my_dict = {‘k1′:’value1′,’k2′:’value2′,’k3′:’value3’}
unpack(**my_dict)

Out: value1 value2 value3

顺便提一下哈,有关 args 和 kwargs 的方法我会专门在后面的一期讲,敬请期待!
字典推导式
这个我写的比较纠结,因为咨询了我的主管,他推荐我尽量不要用,我也不太懂其中原因,不知道有没有大神可以出来解答一下哈,具体用法和 List 的推导式一样,上代码:
import json
first = {x:’A’+str(x) for x in range(8)}
print(json.dumps(first,indent=4, sort_keys=True)) # 这种情况用 json 输出好看些

Out:{
“0”: “A0”,
“1”: “A1”,
“2”: “A2”,
“3”: “A3”,
“4”: “A4”,
“5”: “A5”,
“6”: “A6”,
“7”: “A7”
}
或者可以这么用:
second={v:k for k,v in first.items()}
print(json.dumps(second,indent=4))
Out:{
“A0”: 0,
“A1”: 1,
“A2”: 2,
“A3”: 3,
“A4”: 4,
“A5”: 5,
“A6”: 6,
“A7”: 7
}

至于其他乱七八糟的用法大家可以自己去想哈哈
总结
今天系统地为大家梳理了几点:

创建字典不同方法
字典排序
字典合并
字典解包
json 优化输出
字典推导式

希望可以帮到大家,后续如果我发想有什么有意思的方法和技巧我会加上,再次祝大家新年快乐!!!!

正文完
 0