给妹子讲python-S01E02学会用字典

简介: 字典和列表完全不同,字典里的对象是无序的,他是通过一对对的键和值来反映一种映射关系。字典里,每个键都是唯一的,我们可以通过键来存取对应的值,而不能像列表那样通过位置来索引。

【妹子说】上次讲了列表,今天接着讲讲字典吧。

首先我要说,字典这个容器类型真的非常好用,也非常重要。

字典和列表完全不同,字典里的对象是无序的,他是通过一对对的键和值来反映一种映射关系。字典里,每个键都是唯一的,我们可以通过键来存取对应的值,而不能像列表那样通过位置来索引。

首先来看看怎样用最简单的方法生成一个字典,先弄一个出来再说。

D = {
'name':{'first':'Bob', 'last':'Smith'},
'job' : ['dev','mgr'],
'age' : 0.5,
'addr': 'BeiJing'
}
print(D)

{'job': ['dev', 'mgr'], 'addr': 'BeiJing', 'name': {'first': 'Bob', 'last': 'Smith'}, 'age': 0.5}

从这个例子的输出结果我们可以看出,字典也是可以包含任意的数据类型,即所谓的异构性,甚至可以嵌套一个字典,同时从打印的结果看,字典里的各个元素确实没有什么顺序可言。

对字典值的读取和修改也很简单

D = {'food':'spam', 'quality':4, 'color': 'pink'}
print(D['food'])
D['sex'] = 'gender'
print(D)

spam
{'food': 'spam', 'color': 'pink', 'quality': 4, 'sex': 'gender'}

我们用‘food’键就可以读取其对应的值---字符串对象‘spam’,此外我们还可以原地增加‘sex’键以及对应的值,当然,也可以原地修改其他已有的键和值。

【妹子问】恩,可是我觉得这种方法很死板呀,他要求我们一个一个的把数据手动输入来构建字典,这样子感觉不是很方便呢

这个问题问的太好了。特别是当我们事先不知道字典有哪些键和值的时候,如果想利用在程序中动态获取的数据集来生成字典,上述方法就办不到了。

基于这种需求,我们再介绍其他几个生成字典的方法:

第一种方法:初始为空字典,动态填充新的键和值

D = {}
D['name'] = 'Bob'
D['job'] = 'dev'
print(D)

{'name': 'Bob', 'job': 'dev'}

重点是第二种方法,用列表动态生成字典。

一般来说字典的键是事先约定好的,比如姓名、性别、生日等等,而值往往是要在程序运行过程当中通过用户输入、网页数据抓取等不同手段动态获取的。本方法可以在获取值列表后动态生成一个字典。

key_list = ['a','b','c']
value_list = [11,22,33]
D = dict(zip(key_list, value_list))
print(D)

{'a': 11, 'c': 33, 'b': 22}

第三种方法,用键值对元组组成的列表构造字典。(元组我们后面要讲,就是这个圆括号)

D = dict([('aa',11),('bb',22),('cc',33)])
print(D)

{'cc': 33, 'aa': 11, 'bb': 22}

【妹子问】哦,有了这些好用的方法我就放心啦。还有一个问题:如果我有两个已经生成的字典,想要把他们合并应该怎么做呢?

做法很简单

D1 = {'a':1,'b':2, 'c':3}
D2 = {'c':8, 'd':9}
D1.update(D2)
print(D1)

{'c': 8, 'b': 2, 'a': 1, 'd': 9}

不过要注意,如果这两个字典中有冲突的键,那么会无规律的进行覆盖,所以应该避免这种情况

【妹子说】现在我明白在不同使用场景下如何来生成一个字典了,那我如果访问一个不存在的字典键,应该会报错吧

这么说也对,也不对。

我们具体看看对于键不存在这种情况下的处理技巧。

D = {'a':1,'b':2, 'c':3}
print(D['d'])

Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 2, in <module>
print(D['d'])
KeyError: 'd'

用这种直接访问的方式,如果键不存在就会报错,但是可以引入in判断方法进行避免

D = {'a':1, 'b':2}
print('c' in D)
if not 'c' in D:
print('missing')

False
Missing

其实,有一种更高级的方法实现了上述的判断功能。那就是get方法,get方法中第二个参数指的是键不存在时指定返回的默认值,如果不设置这个值,则返回None

D = {'a':11,'b':22, 'c':33}
print(D.get('d',0))

0

【妹子又问了】我们在实际使用字典时,很多情况下不应该这么一个一个的手动访问字典键吧,比如我想一次性获取所有的键,应该怎么做?

这又是一个好问题,

我们可以用下面的方法来一次性获取包含所有键的列表:

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.keys()))

['b', 'a', 'd', 'e', 'c']

D.Keys方法返回的是一个迭代器,而不是直接就给出一个列表,关于迭代器后面会专门讲的,这里只需记住此处将迭代器作为参数来初始化一个list,可以一次性生成所有的键,并将其打印出来。

想获取值的列表,处理方法也十分类似

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.values()))

[11, 33, 44, 55, 22]

我们还可以用同样类似的方法同时获取键值对的列表

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.items()))

[('d', 44), ('a', 11), ('c', 33), ('e', 55), ('b', 22)]

【妹子说】和列表相类比,下面是不是也得说说字典的删除和排序问题?

对,字典和列表大同小异。而且删除也是利用del和pop两种方法

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
del D['a']
print(D)

{'b': 22, 'c': 33, 'e': 55, 'd': 44}

pop方法是在删除指定键对应的元素的同时,返回这个键所对应的值

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(D.pop('a'))
print(D)

11
{'b': 22, 'e': 55, 'd': 44, 'c': 33}

【妹子反问我了】我记得你最开始的时候说,在字典里对象是无序的呀,那怎么还存在排序的概念呢?

原来是挖坑在等我呀,字典的排序操作实际上是在对键进行排序,他返回一个排好序的键的列表

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(sorted(D))
print(sorted(D.keys()))

['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e']

这里埋一个伏笔,内置函数sorted接受的都是可迭代对象,这个反复出现的概念后面我们一定会好好谈谈。

原文发布时间为:2018-07-19
本文作者:酱油哥
本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区

相关文章
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
42 2
|
3月前
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
31 1
|
5月前
|
存储 JSON 索引
一文让你彻底搞懂 Python 字典是怎么实现的
一文让你彻底搞懂 Python 字典是怎么实现的
97 13
|
4月前
|
存储 Java Serverless
【Python】字典
【Python】字典
50 1
|
5月前
|
存储 数据安全/隐私保护 Python
Python常用数据结构——字典的应用
Python常用数据结构——字典的应用
63 2
|
5月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
204 4
|
5月前
|
Python
Python 字典删除下标前两个
Python 字典删除下标前两个
31 1
|
4月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
67 0
|
4月前
|
存储 自然语言处理 数据库
Python字典操作实现文章敏感词检索
Python字典操作实现文章敏感词检索
57 0
|
4月前
|
存储 JSON 数据处理
分析、总结Python使用列表、元组、字典的场景
分析、总结Python使用列表、元组、字典的场景
57 0

热门文章

最新文章