字典
- Python内置的数据结构之一,与列表一样本身是一个可变序列(这个数据结构本身可以执行增删改的操作)
- 以键值对的方式存储数据,字典是一个无序的序列 (列表是一个有序的序列)
冒号之前的为键,冒号之后的为值,元素之间依旧由逗号分隔
hash(key4) hash(key2) hash(key1) …
我们在往字典当中存储数据的时候,是要经过一个哈希函数的工序 hash(key)计算存储位置
所以要求放在字典中的键必须是一个不可变序列(整数序列,字符串str, 键不可以进行增删改操作),避免产生不确定性因素
堆中的内存空间
- 字典的实现原理:生活中查字典,是根据一些特性查找相应的页码
Python 中的字典则是根据key 查找value所在的位置 (通过hash(key)对键进行计算,因此查找效率很高)
字典的创建
- 快捷方式:直接使用花括号
- 使用内置函数dict(),之后自动匹配
"""字典的创建方式"""
scores = {'张三': 100, '李四': 98, '王五': 45}
print(scores, type(scores))
student = dict(name='jack', age=20)
print(student) # {'name': 'jack', 'age': 20} 自动匹配为键值对的形式
d = {}
print(d) # 空字典
字典的常用操作
字典元素的获取
- []取值与使用get()取值的区别
- []如果字典中不存在指定的key, 则抛出 keyError 异常
- 使用字典的get()方法取值,如果字典中不存在指定的key, 并不会抛出 KeyError 而是返回None,还可以通过参数设置默认的value, 以便指定的 Key不存在时返回
"""获取字典中的元素"""
scores = {'张三': 100, '李四': 98, '王五': 45}
print(scores['张三'])
# print(scores['陈六']) # KeyError: '陈六'
print(scores.get('张三'))
print((scores.get('陈六'))) # None
print(scores.get('麻七', 99)) # 99是在查找'麻七'所对的value不存在时提供的一个默认值
key的判断
in: 指定的key在字典中存在返回 True, 不存在返回False
not in:指定的key在字典中不存在返回 True, 存在返回False
字典元素的删除
del scores['zhangsan']
字典元素的新增
scores['Jack'] = 90
scores = {'zhangsan':100, 'lisi':98, 'wangwu':45}
print('zhangsan' in scores) # True
print('zhangsan' not in scores) # False
del scores['zhangsan'] # 删除指定的键值对 一删就是删一对
print(scores) # 直接打印字典 {'lisi': 98, 'wangwu': 45}
scores.clear() # 清空字典中的所有元素
print(scores) # {}
scores['chenliu'] = 98 # 新增元素
print(scores)
scores['chenliu'] = 100 # 修改元素
print(scores)
获取字典视图的三个方法
- keys() 获取字典中的所有key
- values() 获取字典中的所有value
- items() 获取字典中的所有key, value对
scores = {'zhangsan': 100, 'lisi': 98, 'wangwu': 45}
# 获取所有的key
keys = scores.keys()
print(keys)
print(type(keys)) # <class 'dict_keys'> 类型是 字典的键
print(list(keys)) # 将所有键组成的视图转成列表
print('----------------------')
# 获取所有的值
values = scores.values()
print(values, type(values)) # <class 'dict_values'> 类型是字典的值
print(list(values)) # 同样使用list()函数转换为列表
print('-----------------------')
# 获取所有的key-value对
items = scores.items()
print(items, type(items))
print(list(items)) # 元组()的列表[]
字典元素的遍历
for item in scores:
print(item)
字典的特点
- 字典当中的所有元素都是键值对,key不允许重复(会发生覆盖),value可以重复
- 字典中的元素是无序的(无法指定插入),根据键去计算值所存在的位置
- 字典中的key必须是不可变对象(整数,字符串…)(列表就不能做键)
- 字典和列表一样是可以根据需要动态伸缩的(不需要为之分配空间)
- 字典会浪费较大的内存,是一种使用空间换时间的数据结构(空间间隙很多,但查找很快)
字典生成式
- 内置函数zip()
- 用于将可迭代(循环遍历)的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表
- 字典生成式
{ item.upper() : price for item, price in zip(items, prices)}
'''
item.upper(): 表示字典key的表达式
price: 表示字典value的表达式
item: 自定义表示value的变量
price:自定义表示value的变量
zip(items, prices):可迭代的对象(可以使用for -in循环遍历的对象)
'''
items = ['Fruits', 'Books', 'Others']
prices = [96, 78, 85, 100, 110]
d = {item.upper(): price for item, price in zip(items, prices)} # zip()打包的时候会以元素少的为基准来生成
print(d) # {'FRUITS': 96, 'BOOKS': 78, 'OTHERS': 85}
常用的操作:增删改,判断和遍历
新增和修改都是通过等号赋值的形式将值赋给指定的键
可以使用 in 和 not in 来判断指定的键在字典中是否存在