【Python从入门到精通】(七)Python字典(dict)让人人都能找到自己的另一半|【生长吧!Python】

举报
码农飞哥 发表于 2021/06/28 08:14:02 2021/06/28
【摘要】 学好字典,握住幸福

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
本文主要介绍Python数据类型中的字典(dict),咱们一次把字典聊个透彻。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要欢迎加V: wei158556或者私信我哦~ ~ ~。

@[TOC]

字典是什么?

上一篇文章我们介绍了【Python从入门到精通】(六)Python内置的数据类型-列表(list)和元组(tuple),九浅一深,十个章节,不信你用不到
列表(list)和元组(tuple)这两种非常常用的序列。今天要介绍另外一种使用非常广泛的序列—字典(dict)。小伙伴们哪怕没有接触过dict这个数据类型,也一定听说过字典这个名词---->那大名鼎鼎的新华字典,不会没有人用过吧!!!
在这里插入图片描述
看到这图片,是不是勾起了儿时上学的回忆啦。哈哈哈哈
回想一下我们是怎么通过新华字典查询一个汉字的?是不是根据拼音去查找汉字的,具体查找细节相信大家都懂的。把查询字典的过程映射到同样道理Python中的字典(dict)就是通过键(key)去找值(value)的,字典(dict)底层的数据结构是哈希表的结构。

字典怎么用?

说完了字典的基本概念,接下来就说说字典该如何使用,只有能用起来的东西才是好东西。本章将介绍字典的增删改查。字典的基本结构是:

{'key1':'value1', 'key2':'value2', ..., 'keyn':valuen}

其中key1~keyn表示键,value1~valuen表示键所对应的值。需要注意的是字典中所有的键都是唯一的(每个人都是独一无二的),有且仅有一个键可以为空值None,而且只能用不可变的类型,比如字符串,整数,小数,元组。而值可以是任何Python支持的数据类型且值可以为空值None,为空值None的值的数量不限。
在这里插入图片描述

创建一个字典

创建字典的方式有很多种,下面罗列几种比较常见的方法。
第一种:使用 {} 符号来创建字典,其语法结构是dictname={'key1':'value1', 'key2':'value2', ..., 'keyn':valuen}
第二种:使用fromkeys方法,其语法结构是dictname = dict.fromkeys(list,value=None), 其中,list参数表示字典中所有键的列表(list),value参数表示默认值,如果不写则为所有的值都为空值None。
第三种:使用dict方法,其分为四种情况:

  1. dict() -> 创建一个空字典
  2. dict(mapping) -> 创建一个字典,初始化时其键值分别来自于mapping中的key,value。
  3. dict(iterable) -> 创建一个字典,初始化时会遍历iterable得到其键值。
for k, v in iterable:
                d[k] = v
  1. dict(**kwargs) -> **kwargs 是可变函数,其调用的语法格式是:dict(key1=value1,key2=value2,...keyn=valuen),例如:dict(name='码农飞哥', age=17, weight=63)
    这三种创建字典的方式都介绍完了,下面就来看看示例说明吧:
#1. 创建字典
d = {'name': '码农飞哥', 'age': 18, 'height': 185}
print(d)
list = ['name', 'age', 'height']
# 2. fromkeys方法
dict_demo = dict.fromkeys(list)
dict_demo1 = dict.fromkeys(list, '测试')
print(dict_demo)
print(dict_demo1)
# 通过dict()映射创建字典,传入列表或者元组
demo = [('name', '码农飞哥'), ('age', 19)]
dict_demo2 = dict(demo)
print(dict_demo2)
dict_demo21 = dict(name='码农飞哥', age=17, weight=63)
print(dict_demo21)

运行结果是:

{'name': '码农飞哥', 'age': 18, 'height': 185}
{'name': None, 'age': None, 'height': None}
{'name': '测试', 'age': '测试', 'height': '测试'}
{'name': '码农飞哥', 'age': 19}
{'name': '码农飞哥', 'age': 17, 'weight': 63}

字典的访问

说完了字典的创建之后,接着就让我们来看看字典的访问。字典不同于列表和元组,字典中的元素不是依次存储在内存区域中的;所以,字典中的元素不能通过索引来访问,只能是通过键来查找对应的值。 ,其有两种不同的写法。

  1. 第一种方式的语法格式是dictname[key] ,其中dictname表示字典的名称,key表示指定的键。如果指定的键不存在的话,则会报KeyError 错误
  2. 第二种方式的语法格式是dictname.get(key),其中dictname表示字典的名称,key表示指定的键。如果指定的键不存在的话,则会返回None。
    举个栗子说明下吧,下面代码的意思是根据键名为name 查找其对应的值。
dict_demo5 = {'name': '码农飞哥', 'age': 18, 'height': 185}
print(dict_demo5['name'])
print(dict_demo5.get('name'))
print('键不存在的情况返回结果=',dict_demo5.get('test'))

运行结果是:

码农飞哥
码农飞哥
键不存在的情况返回结果= None

在这里插入图片描述

添加和修改键值对

添加键值对的方法很简单,其语法结构是dictname[key]=value,如果key在字典中不存在的话,则会新增一个键值对。如果key在字典中存在的话,则会更新原来键所对应的值。依然是举例说明下:本例中代码的结果是增加键值对 sex='男',把键height对应的值改成了190

# 添加键值对
dict_demo6 = {'name': '码农飞哥', 'age': 18, 'height': 185}
dict_demo6['sex'] = '男'
print('新增键值对的结果={0}'.format(dict_demo6))
# 修改键值对
dict_demo6['height'] = 190
print('修改键值对的结果={0}'.format(dict_demo6))

运行结果是:

新增键值对的结果={'age': 18, 'name': '码农飞哥', 'height': 185, 'sex': '男'}
修改键值对的结果={'age': 18, 'name': '码农飞哥', 'height': 190, 'sex': '男'}

当然修改和删除键值对也可以通过update方法来实现,其具体的语法格式是:dictname.update(dict) ,其中,dictname为字典的名称,dict为要修改的字典的值。该方法既可以新增键值对,也可以修改键值对。 该方法没有返回值,即是在原字典上修改元素的。下面例子中就是将键name的值改成了飞飞1024,键age对应的值改成了25。并新增了键值对 like=学习

# update方法
dict_demo7 = {'name': '码农飞哥', 'age': 18, 'height': 185, 'width': 100}
dict_demo7.update({'name': '飞飞1024', 'age': 25, 'like': '学习'})
print('update方法返回结果={}', dict_demo7)

运行结果为:

update方法返回结果={} {'height': 185, 'like': '学习', 'width': 100, 'name': '飞飞1024', 'age': 25}

删除键值对

删除键值对的方法有三种:

  1. 第一种是del dictname[key],使用del关键字,其中dictname为字典的名称,key为要删除的键。如果键不存在的话则会报KeyError错误。
  2. 第二种方式是通过pop方法,其语法结构是:dictname.pop(key)。该方法是用于删除指定键值对,没有返回值,如果key不存在的话不会报错。
  3. 第三种方式是通过popitem方法,其语法结构是:dictname.popitem()。该方法用于删除字典中最后一个键值对。举例说明下吧:
dict_demo10 = {'name': '码农飞哥', 'age': 18, 'height': 185, 'width': 100}
# 删除键值对
del dict_demo6['height']
print('删除键height对之后的结果=', dict_demo6)
# pop()方法和popitem()方法
dict_demo10.pop('width')
print('pop方法调用删除键width之后结果=', dict_demo10)
dict_demo10 = {'name': '码农飞哥', 'age': 18, 'height': 185, 'width': 100}
dict_demo10.popitem()
print('popitem方法调用之后结果=', dict_demo10)

运行结果是:

删除键height对之后的结果= {'name': '码农飞哥', 'sex': '男', 'age': 18}
pop方法调用删除键width之后结果= {'name': '码农飞哥', 'height': 185, 'age': 18}
popitem方法调用之后结果= {'width': 100, 'name': '码农飞哥', 'height': 185}

可以看出popitem方法删除的键并不是最后一个键width,而是键age。而且删除之后字典中元素的顺序都改变了。

其他的方法说明:

  1. 判断指定键在字典中是否存在,其语法结构是:key in dictname,其中key要查找的键,dictname是字典名称。in 表示查找键是否在字典中存在,如果是查找键是否不再字典中存在,则需要用 not in关键字。举个例子:
dict_demo6 = {'name': '码农飞哥', 'age': 18, 'height': 185}
print('判断键name是否存在的结果是=', ('name' in dict_demo6))
  1. 输出字典中所有的键,调用的方法是keys(),其语法结构是:dictname.keys()。其中dictname为字典名称。
  2. 输出字典中所有的值,调用的方法是values(),其语法结构是:dictname.values()
  3. 输出字典中所有的键值对,调用的方法是items(),其语法结构是:dictname.items()
    举个例子说明下吧:
dict_demo7 = {'name': '码农飞哥', 'age': 18, 'height': 185, 'width': 100}
print('keys方法返回结果=', dict_demo7.keys())
print('value方法返回结果=', dict_demo7.values())
print('item方法返回结果=', dict_demo7.items())

输出结果是:

keys方法返回结果= dict_keys(['width', 'name', 'height', 'age'])
value方法返回结果= dict_values([100, '码农飞哥', 185, 18])
item方法返回结果= dict_items([('width', 100), ('name', '码农飞哥'), ('height', 185), ('age', 18)])

使用字典格式化字符串

在序列那篇文章我们介绍了可以通过顺序转换说明符,其语法格式是:{num},num是编号,从0开始依次递增 搭配format 方法来格式化字符串。但是这种方法也是有弊端的,就是当字符串中有大量转换说明符时,就不方便使用了。

str = '码农飞哥{0},你一定会有={1}'
print(str.format('加油', '出息'))

输出结果是码农飞哥加油,你一定会有=出息 ,这里的传参要严格按照顺序传参。
这时候我们可以通过字典来格式化字符串,其语法格式是%(name)s 其中%是固定的写法,name对应字典中的key,s 表示字典键为name的值的类型,如果是字符串则是s。最后要通过str%dictname来输出格式化后的字符串,其中str是原始的字符串,dictname是字典的名称。举个栗子吧!

str = '码农飞哥的第=%(num)s篇=%(article)s,希望=%(reader)s喜欢'
dict_demo12 = {'num': 250, 'article': '文章', 'reader': '读者们'}
print(str % dict_demo12)

运行结果是码农飞哥的第=250篇=文章,希望=读者们喜欢
在这里插入图片描述

总结

本文详细介绍了Python字典的基本概念和详细用法,希望对读者朋友们有所帮助。


好文推荐

【Python从入门到精通】(六)Python内置的数据类型-列表(list)和元组(tuple),九浅一深,十个章节,不信你用不到
【Python从入门到精通】(五)Python内置的数据类型-序列和字符串,没有女友,不是保姆,只有拿来就能用的干货
【Python从入门到精通】(四)Python的内置数据类型有哪些呢?数字了解一下

我是码农飞哥,再次感谢您读完本文
【生长吧!Python】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/278897

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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