字典 dict: 使用一对大括号 定义,元素由键: 值对组成
键值之间使用冒号,键值对之间使用逗号分隔
python
dict1 = {} # 空字典
dict2 = {'name': 'zhangsan'}
print(type(dict1), type(dict2)) # <class 'dict'> <class 'dict'>
# 键重复,则显示最后键的值
dict3 = {'name': 'zhangsan', 'name': 'lisi'}
print(type(dict3), dict3) # <class 'dict'> {'name': 'lisi'}
字典要注意以下几点:
1.字典属于可变的数据类型
2.字典的键相同时,只会记录最后一个键的值
3.字典中的键只能是不可变的数据类型(数值、字符、元组),值数据类型不限
4.字典的键通常为字符和数字,键不会重复
python
# 字典中的键只能是不可变的数据类型(数值、字符、元组),值数据类型不限
dict4 = {1: 'a', 'x': 2, ('a', 1): [2, 'b']}
print(type(dict4), dict4) # <class 'dict'> {1: 'a', 'x': 2, ('a', 1): [2, 'b']}
可以使用 dict 创建字典,有三种格式:
1.关键字:dict(键1 = 值1, 键2 = 值2, ...)
python
# 关键字创建字典,dict(键1 = 值1, 键2 = 值2)
d1 = dict(a=1, b=2, c=3)
print(d1) # {'a': 1, 'b': 2, 'c': 3}
2.元组键值对:dict([(键1, 值1), (键2, 值2), ...])
python
# 键值对创建字典,dict([(键1, 值1), (键2, 值2)])
d2 = dict([(1, 'x'), ('y', 2)])
print(d2) # {1: 'x', 'y': 2}
3. zip 打包映射键值对:dict(zip(迭代对象, 迭代对象))
zip 函数:将多个迭代对象压缩到一组进行进行组合,打包为一个元组,返回 zip 对象
python
# zip打包映射键值对:dict(zip(迭代对象, 迭代对象))
z = zip('python', '123456')
print(type(z)) # <class 'zip'>
print(list(z)) # [('p', '1'), ('y', '2'), ('t', '3'), ('h', '4'), ('o', '5'), ('n', '6')]
print(dict(zip('python', '123456'))) # {'p': '1', 'y': '2', 't': '3', 'h': '4', 'o': '5', 'n': '6'}
压缩以最短长度为主
解包:通过 * 将打包的对象进行还原,zip(*打包对象)
查看字典内容:
keys,查看键,类型是 dict_keys 字典视图
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3.keys(), type(d3.keys())) # dict_keys(['name', 'age']) <class 'dict_keys'>
获取字典的键,返回字典视图,使用 list 返回列表
python
print(list(d3.keys())) # ['name', 'age']
同理,获取字典的值 values,返回字典视图,使用 list 返回列表
values,查看值,类型是 dict_values 字典视图
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3.values(), type(d3.values())) # dict_values(['zhangsan', 18]) <class 'dict_values'>
print(list(d3.values())) # ['zhangsan', 18]
items 获取键值对组成的元组,list 返回,字典视图是 dict_items
python
print(d3.items(), type(d3.items())) # dict_items([('name', 'zhangsan'), ('age', 18)]) <class 'dict_items'>
print(list(d3.items())) # [('name', 'zhangsan'), ('age', 18)]
字典的索引:使用一对中括号 [ ] 和 key
格式:字典[键]
返回键的值,键不存在则报错
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3['name'], d3['age']) # zhangsan 18
获取字典键的值:
get(键, 新值)
当键存在返回原来的值
键不存在则返回新值,若缺少新值,返回 None
python
d3 = {'name': 'zhangsan', 'age': 18}
# 键存在,再设置新值,返回原来的值
print(d3.get('age', 20)) # 18
# get不存在的键,返回None
print(d3.get('sex')) # None
# get不存在的键,但设置了新值,返回新值
print(d3.get('sex', '男')) # 男
setdefault(键, 新值) 与 get(键, 新值) 类似
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3.setdefault('sex')) # None
print(d3) # {'name': 'zhangsan', 'age': 18, 'sex': None}
二者区别:
当使用 setdefault 获取键时,如果键不存在,将键添加到字典中
所以再在后面添加新值,返回的是原值 None
字典的删除函数:
**pop(指定键):**删除指定的键,返回建的值,键不存在则报错
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3.pop('age')) # 18
print(d3) # {'name': 'zhangsan'}
popitem():删除最后一对键值,返回元组 (键, 值)
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3.popitem()) # ('age', 18)
print(d3) # {'name': 'zhangsan'}
clear 清空原字典键值,返回 None,原字典变成空字典
python
d3 = {'name': 'zhangsan', 'age': 18}
print(d3.clear()) # None
print(d3) # {} 空字典
update(键值对),在原字典中更新内容
python
d3 = {'name': 'zhangsan', 'age': 18}
# 更新内容为关键字
d3.update(a=1, b=2)
print(d3) # {'name': 'zhangsan', 'age': 18, 'a': 1, 'b': 2}
# 更新内容为键值对
d3.update([(1, 'x'), ('y', 2)])
print(d3) # {'name': 'zhangsan', 'age': 18, 'a': 1, 'b': 2, 1: 'x', 'y': 2}
copy字典的浅拷贝,创建新字典,如果修改可变类型,原内容也会改变
python
d4 = {'name': 'zhangsan', 'age': [16, 18, 20]}
print(d4, id(d4)) # {'name': 'zhangsan', 'age': [16, 18, 20]} 2698597154624
# copy复制
d5 = d4.copy()
print(d5, id(d5)) # {'name': 'zhangsan', 'age': [16, 18, 20]} 2698597530368
# 修改字典
d5['age'][0] = 12
print(d5, id(d5)) # {'name': 'zhangsan', 'age': [12, 18, 20]} 2698597530368
# 复制的字典修改后,原字典同样修改
print(d4, id(d4)) # {'name': 'zhangsan', 'age': [12, 18, 20]} 2698597154624
fromkeys(可迭代对象, 值),用来构造字典, 值默认返回 None
python
d = {}
# 对象为字符串
dict5 = d.fromkeys('python')
print(dict5) # {'p': None, 'y': None, 't': None, 'h': None, 'o': None, 'n': None}
dict6 = d.fromkeys('python', 10)
print(dict6) # {'p': 10, 'y': 10, 't': 10, 'h': 10, 'o': 10, 'n': 10}
# 对象为列表、元组
dict7 = d.fromkeys(['a', 'b'], 20)
print(dict7) # {'a': 20, 'b': 20}