【Python】字典

简介: 【Python】字典

什么是字典

键值对


字典是一种存储“键值对”的结构

(key) 和 (value) 进行一个一对一的映射,然后就可以根据键,快速找到值

举个栗子:学校的每个同学,都会有一个唯一的学号

知道了学号,就能确定这个同学

此处 “学号” 就是 “”,这个 “同学” 就是 “

Python 字典中,可以同时包含很多个键值对,同时要求这些键值对不能重复

创建字典

# 创建字典  
a = { }  
b = dict()  
  
print(type(a))  
print(type(b))
"""
打印结果
<class 'dict'>
<class 'dict'>
"""

设置初始值

也可以在创建字典的时候设置初始值

a = {  
    'id': 1,  
    'name': 'zhangsan'  
}
print(a)
"""
打印结果
{'id': 1, 'name': 'zhangsan'}
"""
  • 使用 , 分割不同的键值对;键值对中用 : 分割不同的键和值
  • 在这个字典 a 中,包含了两个键值对:
  • 'id': 1, key 就是 'id'value 就是 1
  • ‘name’: zhangsan,key 就是 'name'value 就是 'zhangsan'
  • 一个字典中的 key 的类型不一定都一样
  • 一个字典中的 value 的类型也不必都一样
  • 字典对于 key 是什么类型,有约束
  • 字典对于 value 是什么类型,没有约束

查找 key

判定 key 是否存在

使用 in 来判定某个 key 是否在字典中存在

a = {  
    'id': 1,  
    'name': 'zhangsan'  
}  
  
print(('id' in a))  
print('classId' in a)
"""
运行结果
True
False
"""
  • a 里面有 'id' 这个 key,没有 'classId' 这个 key
  • 这个操作只是判定 key 是否存在,和 value 无关

使用 not in 来判定某个 key 在字典中不存在

a = {  
    'id': 1,  
    'name': 'zhangsan'  
}  
  
print(('id' not in a))  
print('classId' not in a)
"""
运行结果
False
True
"""

根据 key 获取 value

a = {  
    'id': 1,  
    'name': 'zhangsan',  
    100: 'list'
}  
  
print(a['id'])
print(a['name])
print(a[100])
"""
运行结果
1
'zhangsan'
'list'
"""
  • 若根据一个不存在的 key 获取 value,就会报出“KeyError '不存在的 key 名'”的异常
  • 对于字典来说,使用 in 或者 [] 都是非常高效的操作
  • 对于列表来说,使用in比较低效,而使用[]比价高效
  • 因为 in 需要把整个列表遍历一遍
  • 字典背后使用了特殊的数据结构:哈希表

新增和修改

新增元素

在字典中新增元素,使用 [ ] 来进行

a = {  
    'id': 1,  
    'name': 'zhangsan'  
}  
  
a['score'] = 90  
  
print(a)
"""
运行结果
{'id': 1, 'name': 'zhangsan', 'score': 90}
"""

修改元素

在字典中修改元素,使用 [ ] 来进行

a = {  
    'id': 1,  
    'name': 'zhangsan'  
}  
  
a['score'] = 90  
print(a)  
  
a['score'] = 100  
print(a)
"""
运行结果
{'id': 1, 'name': 'zhangsan', 'score': 90}
{'id': 1, 'name': 'zhangsan', 'score': 100}
"""
  • 如果 key 不存在,往里写入,相当于新增键值对
  • 如果 key 存在,往里写入,相当于根据 key 修改 value
  • 新增和修改都是写操作

删除

使用 pop 方法,根据 key 来删除键值对

a = {  
    'id': 1,  
    'name': 'zhangsan'  
}  
  
a.pop('name')  
print(a)
"""
运行结果
{'id': 1}
"""

字典中的各种操作,都是针对 key 来进行的,新增、删除、获取 value、修改 value…

遍历字典

遍历指的是能够把一个可迭代对象里面包含的元素依次地取出来,并进行一些操作,整个过程要求不重不漏

  • 字典被设计出来的初衷,不是为了实现遍历,而是为了增删改查
  • 字典是哈希表,进行增删改查的操作时效率是非常高的
  • 而字典的遍历效率就要差一些
  • 哈希表这个结构设计的非常巧妙,能够以“常数级”时间复杂度来完成增删改查
  • 无论字典中有多少个元素,新增、修改、查找、删除操作的时间都是固定的,不会因为元素多了,操作就慢了

直接使用 for 来遍历字典

a = {  
    'id': 1,  
    'name': 'zhangsan',  
    'score': 100  
}  
  
for key in a:  
    print(key, a[key])
"""
运行结果
id 1
name zhangsan
score 100
"""
  • C++/Java 中,哈希表里面的兼职对存储的循序是无序的;但是在 Python 中,其做了特殊处理,能保证遍历出来的顺序就是和插入的顺序一致

取出所有 key 和 value

  • keys:获取到字典中的所有 key
  • values:获取到字典中的所有 value
  • items:获取到字典中的所有键值对
a = {  
    'id': 1,  
    'name': 'zhangsan',  
    'score': 100  
}  
  
print(a.keys())
print(a.values())  
print(a.items())
"""
运行结果
dict_keys(['id', 'name', 'score'])
dict_values([1, 'zhangsan', '100'])
dict_items([('id', 1), ('name', 'zhangsan'), ('score', '100')])
"""
  • 此处 dict_keys 是一个特殊的类, 专门用来表示字典的所有 key,大部分元组支持的操作对于 dict_keys 同样适用
  • 此处 dict_values 也是一个特殊的类型,和 dict_keys 类似
  • 此处 dict_items 也是一个特殊的类型,和 dict_keys 类似
a = {  
    'id': 1,  
    'name': 'zhangsan',  
    'score': 100
}  
for key, value in a:
  print(key, value)
"""
运行结果
id 1
name zhangsan
score 100
"""

合法 key 的类型

不是所有的类型都可以作为字典的 key

字典本质上是一个哈希表,哈希表的 key 要求是 “可哈希的”,也就是可以计算出一个哈希值

  • 可以使用 hash 函数计算某个对象的哈希值
  • 但凡能够计算出哈希值的类型,都可以作为字典的 key
print(hash(0))  
print(hash(3.14))  
print(hash(True))  
print(hash('hello'))  
print(hash((1, 2, 3)))
"""
运行结果
0
322818021289917443
1
2364418584814311179
529344067295497451
"""

列表和字典是不可 hash 的,所以列表和字典不能作为 key,其他类型都可以作为 key

  • 一般认为不可变的对象就可哈希
  • 可变的对象就不可以哈希


相关文章
|
2月前
|
存储 JSON 索引
一文让你彻底搞懂 Python 字典是怎么实现的
一文让你彻底搞懂 Python 字典是怎么实现的
53 13
|
2月前
|
存储 数据安全/隐私保护 Python
Python常用数据结构——字典的应用
Python常用数据结构——字典的应用
|
2月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
126 4
|
2月前
|
Python
Python 字典删除下标前两个
Python 字典删除下标前两个
|
1月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
31 0
|
1月前
|
存储 自然语言处理 数据库
Python字典操作实现文章敏感词检索
Python字典操作实现文章敏感词检索
|
1月前
|
存储 JSON 数据处理
分析、总结Python使用列表、元组、字典的场景
分析、总结Python使用列表、元组、字典的场景
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (一)
Python操作:字符串--列表--元组--字典--运算符 (一)
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (二)
Python操作:字符串--列表--元组--字典--运算符 (二)
|
2月前
|
存储 数据安全/隐私保护 Python
Python常用数据结构—字典
Python常用数据结构—字典