字典高级用法

举报
brucexiaogui 发表于 2022/08/24 22:40:40 2022/08/24
【摘要】 字典高级用法 1.概述 这篇文章总结在开发中使用字典的一些技巧。 2.字典常用操作 字典存储的内容不是单一维度的线性序列,而是多维度的key: value键值对。 2.1.创建字典 字典也有两...

字典高级用法

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。