系列攻略:Python技巧(01):条件语句的七种写法Python有很多(而且越来越多)的高级特性,深受Python爱好者的喜爱。在这些人眼里,能写出普通开发者看不懂的高级功能的,就是高手,就是神。但是你要知道,在团队合作中,炫技是大忌。你为什么这么说?分享一下我的看法:代码越简洁,逻辑越清晰,越不容易出错;在团队协作中,你的代码不仅由你自己维护,减少阅读/理解其他人代码逻辑的代价是良好的道德简单代码,只会使用最基本的语法糖,复杂的高级功能,会有更多的依赖(如语言版)内容,在这个系列中,我会总结和盘点我所看到的技巧。在这里,如果你是Python爱好者,你可以学到一些很酷的代码编写技巧。同时,阅读这些内容可能对你阅读别人的代码有帮助。1、最简单的就地更新字典对象有一个内置的update方法,用于将另一个字典更新到自己。>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>profile.update(ext_info)>>>print(profile){'name':'xiaoming','age':27,'gender':'male'}如果你想用update,最简单最正宗的方法,但是又不想更新自己,和要生成新对象,请使用深拷贝。>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>fromcopyimportdeepcopy>>>>>>>>full_profile=deepcopy(profile)>>>full_profile.update(ext_info)>>>>>>print(full_profile){'name':'xiaoming','age':27,'gender':'male'}>>>print(profile){"name":"xiaoming","age":27}2.先解包再合并字典用**解包字典,解包后用dict或{}合并。>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>full_profile01={**profile,**ext_info}>>>>print(full_profile01){'name':'xiaoming','age':27,'gender':'male'}>>>>>>full_profile02=dict(**profile,**ext_info)>>>print(full_profile02){'name':'xiaoming','age':27,'gender':'male'}如果你不知道dict(**profile,**ext_info)是做什么的,你可以把相当于>>>dict((("name","xiaoming"),("age",27),("gender","male"))){'name':'xiaoming','age':27,'gender':'male'}3.借助itertools,Python中有一个非常强大的内置模块,专门用来操作可迭代对象。恰好我们的字典也是可迭代对象,所以很自然的想到可以使用itertools.chain()函数将多个字典(可迭代对象)拼接成一个更大的可迭代对象,然后用dict转换成一本字典。>>>importitertools>>>>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>>>>>>>dict(itertools.chain(profile.items(),ext_info.items())){'name':'xiaoming','age':27,'gender':'male'}4.如果可以介绍一个辅助包,那我再提一个,ChainMap也可以达到和itertools一样的效果。>>>fromcollectionsimportChainMap>>>>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>dict(ChainMap(profile,ext_info)){'name':'xiaoming','age':27,'gender':'male'}使用ChainMap需要注意的一点是,当字典之间有重复的key时,只有第一个会取值,后面的key值不会更新前面的(使用itertools不会有这个问题)。>>>fromcollectionsimportChainMap>>>>>>profile={"name":"xiaoming","age":27}>>>ext_info={"age":30}>>>dict(ChainMap(profile,ext_info)){'name':'xiaoming','age':27}5.使用dict.items()合并在Python3.9之前,其实是有|的运算符,但通常用于集合(set)取联合。利用这一点,它也可以用于合并字典,但它要绕一圈,有点难以理解。你必须使用items方法将dict转换为dict_items,然后将两个dict_items取并,最后使用dict函数将其转换为字典。>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>full_profile=dict(profile.items()|ext_info.items())>>>full_profile{'gender':'male','age':27,'name':'xiaoming'}当然,如果你觉得这样太麻烦,你也可以简单地使用它直接将列表函数再次合并(以Python3.x为例)>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>dict(list(profile.items())+list(ext_info.items())){'name':'xiaoming','age':27,'gender':'male'}如果你在Python2.x下,list函数可以直接省略。>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>dict(profile.items()+ext_info.items()){'name':'xiaoming','age':27,'gender':'male'}6.最酷的字典分析Python有一套非常Pythonic的生成列表、集合、字典的写法.那就是列表推导、集合推导和字典推导,通常是Python爱好者的最爱,那么今天的话题:字典归并,字典推导能胜任吗?当然,具体的示例代码如下:>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>>{k:vfordin[profile,ext_info]fork,vind。items()}{'name':'xiaoming','age':27,'gender':'male'}7.Python3.9的新特性在2月份发布的Python3.9.04a版本中,新增了一个抓取Eyeball的新特性operatoroperator:|,PEP584称之为UnionOperator,可以直观的用于合并多个字典。>>>profile={"name":"xiaoming","age":27}>>>ext_info={"gender":"male"}>>>>>>profile|ext_info{'name':'xiaoming','age':27,'gender':'male'}>>>>>>ext_info|profile{'gender':'male','name':'xiaoming','age':27}>>>>>>除了|operator,还有一个operator|=,类似于in-placeupdate。>>>ext_info|=profile>>>ext_info{'性别':'男','姓名':'小明','年龄':27}>>>>>>>>>profile|=ext_info>>>profile{'name':'xiaoming','age':27,'gender':'male'}看到这里,你站姿高了吗?学了这么久的Python,没想到还有这么多合并字典。方法。这篇文章的目的不是让你掌握所有的7种合并词典的方法。事实上,您只需要选择最方便的方式即可。但是在协同工作中,或者阅读别人的代码时,难免会遇到各种各样的写法。这时候你能下意识的知道这是合并字典的操作,那么这篇文章就有意义了。
