Python 进阶之路 (二) Dict 进阶宝典

新年快乐

你们好,今天是大年初二,身在国外没有过年的氛围,只能踏实写写文章,对社区作点贡献,在此祝你们新年快乐!上一期为你们梳理了一些List的进阶用法,今天咱们来看字典Dict的相关技巧,我我的在编程中对字典的使用很是频繁,其实对于不是很是大的数据存储需求,字典是一个不错的选择,比List要快的多,我在基础篇里面讲过了一些关于dict的基础方法,若是没有看过的朋友们能够点击连接Python 基础起步 (八) 字典实用技巧大全 ,好啦,闲话少说,如今让咱们一块儿来看看今天的进阶技巧吧~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也能够很简单的实现,有关建立就说这么多啦json

字典排序

有关字典排序,咱们有两种选择,第一是根据字典的key值排序,第二是根据Value值排序,让咱们一个个来看,首先让咱们新建一个字典用于测试:segmentfault

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,看下结果:app

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的用户说一声对不起,技术一直说是喜新厌旧呀,让咱们看一个小栗子:spa

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优化输出
  • 字典推导式

但愿能够帮到你们,后续若是我发想有什么有意思的方法和技巧我会加上,若是你们对Dict
的其余使用技巧感兴趣,能够关注个人微信公众号Python极简教程,我会把最高效,简洁的小技巧一一记录下来,分享给你们:

图片描述

相关文章
相关标签/搜索