字典高级用法
字典高级用法
1.概述
这篇文章总结在开发中使用字典的一些技巧。
2.字典常用操作
字典存储的内容不是单一维度的线性序列,而是多维度的key: value键值对。
2.1.创建字典
字典也有两种定义方式,字面量表达式和dict() 内置函数。
# 字面量表达式创建字典
movie = {'name': 'Burning', 'type': 'movie', 'year': 2018}
# 内置函数创建字典
d = dict(name='Burning', type='movie')
- 1
- 2
- 3
- 4
- 5
2.2.遍历字典
# 遍历字典获取key和value
movie = {'name': 'Burning', 'type': 'movie', 'year': 2018}
for key, value in movie.items():
print(f'遍历输出字典的key和value:{key}: {value}')
- 1
- 2
- 3
- 4
3.字典高级操作
3.1.访问字典不存在的键
当用不存在的键访问字典内容时,程序会抛出KeyError异常,我们称为程序的边界情况。常用处理方式有两种。
- 读取内容前先做一次判断,只有判断通过才做其他操作。
- 直接操作,捕获Key Error 异常
# 获取字典中let键的值,如果该键不存在则返回一个默认值
# 第一种写法判断key是否存在
if 'let' in movie:
let = movie['let']
else:
let = 0
# 第二种写法捕获异常
try:
let = movie['let']
except KeyError:
let = 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
除了上面的两种方法,字典还提供了一个get方法获取key的值,它接收两个参数,其中default参数,当访问的key不存在时,方法会返回default默认值。
# 当key不存在时返回设置的默认值
movie.get('let', 0)
- 1
- 2
3.2.使用setdefault取值并修改
有时,我们需要修改字典中某个可能不存在的键,比如下面的代码示例,我需要往字典movie的hobby键里追加新值,但movie[‘hobby’] 的键可能不存在。因此需要写一段异常捕捉逻辑,如下面示例。
movie = {'name': 'Burning', 'type': 'movie', 'year': 2018}
try:
movie['hobby'].append('读书')
except KeyError:
movie['hobby'] = ['读书']
print(f'字典添加新值:{movie}')
# 输出结果
字典添加新值:{'name': 'Burning', 'type': 'movie', 'year': 2018, 'hobby': ['读书']}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
针对上面的情况,还有一个更适合的工具:setdefault(key, default=None) 方法。使用它可以直接删掉上面异常捕获,代码会变得更简单。
setdefault(key, default=None) 方法会产生两种结果,当key不存在时,该方法会把default值写入字典的key位置,并返回该值;当key存在时,该方法就会直接返回字典中的值。
movie = {'name': 'Burning', 'type': 'movie', 'year': 2018}
movie.setdefault('hobby',[]).append('读书')
print(f'setdefault方法添加新值:{movie}')
# 输出结果
setdefault方法添加新值:{'name': 'Burning', 'type': 'movie', 'year': 2018, 'hobby': ['读书']}
- 1
- 2
- 3
- 4
- 5
3.3.使用pop方法删除不存在的键
当删除字典中某个键,一般会使用del d[key] ;但如果要删除的键不存在就会抛出KeyError异常,因此要安全的删除某个键,需要加上一段异常捕获。
movie = {'name': 'Burning', 'type': 'movie', 'year': 2018}
# del删除不存在的键会报KeyError异常
del movie['hobby']
# 异常信息
KeyError: 'hobby'
# 捕获异常
try:
del movie['hobby']
except KeyError:
print(KeyError)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
假如只是想去掉某个键,不关系它存在与否,删除是否成功,使用dict.pop(key, default) 方法代码更简单,省去了捕获异常的代码,同时当键不存在时也不会抛出异常。
movie.pop('year',None)
print(f'使用pop删除键:{movie}')
# 输出结果
使用pop删除键:{'name': 'Burning', 'type': 'movie'}
movie.pop('hobby', None)
print(f'使用pop删除不存在的键:{movie}')
# 输出结果
使用pop删除不存在的键:{'name': 'Burning', 'type': 'movie'}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.4.字典推导式
字典和列表一样都有自己的推导式,可以用它来过滤和处理字典成员。
movie = {'name': 'Burning', 'type': 'movie', 'year': 2018}
d = {key:value for key, value in movie.items() if key == 'year'}
print(f'列表推导式,创建一个新的字典:{d}')
- 1
- 2
- 3
3.5.认识字典有序性与无序性
在Python3.6版本以前,python的字典是无序的。例如当你按照某种顺序把内容放进字典后,获取字典内容时顺序就变量,这是因为字典的key是按照hash值排序。但Python在进化,Python3.6版本为字典引入了一个改进,优化了底层实现,同时实现了存放数据和读取数据顺序一致。
在python的collections模块里还有一个有序字典对象OrderedDict,他可以保证在在3.6之前的版本里字典是有序的。
既然普通的字典已经实现了有序性,那么OrderedDict是否还有必要保留吗。其实他们还是有一个细微的差别的,比如在对比两个内容相同而顺序不同的字典时,普通对象会返回True,而OrderedDict会返回False。
d1 = {'a': 'a', 'b': 'b', 'c': 'c'}
d2 = {'c': 'c', 'a': 'a', 'b': 'b'}
print(f'对比两个普通字典对象是否一致: {d1 == d2}')
# 输出结果
对比两个普通字典对象是否一致: True
from collections import OrderedDict
d1 = OrderedDict(a='a', b='b')
d2 = OrderedDict(b='b', a='a')
print(f'对比两个有序字典对象是否一致: {d1 == d2}')
# 输出结果
对比两个有序字典对象是否一致: False
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/126491381
- 点赞
- 收藏
- 关注作者
评论(0)