字典是另一种可变容器模型,且可存储任意类型对象,它用于存放具有映射关系的数据。
字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。 程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就是 Python 中的字典类型。
scores = {'语文': 89, '数学': 92, '英语': 93}
print(scores)
# 空的花括号代表空的dict
empty_dict = {}
print(empty_dict)
# 使用元组作为dict的key
dict2 = {(20, 30):'good', 30:'bad'}
print(dict2)
运行结果:
{'语文': 89, '数学': 92, '英语': 93}
{}
{(20, 30): 'good', 30: 'bad'}
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 直接通过 key 访问 value
print(stus["addr"])
# 可以通过 dict.get(key) 来访问 value
print(stus.get("addr"))
# 直接通过 key 访问 value 和 通过 dict.get(key) 来访问 value 的区别
# 分别通过以下两种方式获取一个不存在的 key
print(stus.get("name1")) # 获取不到 key 默认返回 None
print(stus["name1"]) # 获取不到,会报错 key error
运行结果:
北京
北京
None
Traceback (most recent call last):
File "/Users/zhulixiang/Downloads/pythonProject/thz/Day02/字典.py", line 17, in
print(stus["name1"]) # 获取不到,会报错 key error
KeyError: 'name1'
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 对存在的 key-value 赋值,就会改变原有的 key-value 对
stus["age"] = 30
print(stus["age"])
print(stus)
运行结果:
30
{'name': 'lixiang', 'id': 1, 'age': 30, 'addr': '北京', 'high': 188}
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 添加一个不存在的 key,就可以为 dict 新增 key-value 对
stus["phone"] = 110
print(stus)
stus.setdefault("email", "[email protected]")
print(stus)
# 使用 .setdefault 方法增加 key-value 对时,如果已经存在了相同的 key,那么默认是不修改的
stus.setdefault("age", "beijing")
print(stus)
运行结果:(大家可以看到 age 的 value 并没有发生改变)
{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188, 'phone': 110}
{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188, 'phone': 110, 'email': '[email protected]'}
{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188, 'phone': 110, 'email': '[email protected]'}
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 通过 pop 指定 key 删除 key-value 对
stus.pop("age")
print(stus)
# 通过 del 指定 key 删除 key-value 对
del stus['id']
print(stus)
# 随即删除一个元素,虽然是随机,但是和 pop 一样实际删除的是最后一个 key-value 对
stus.popitem()
print(stus)
运行结果:
{'name': 'lixiang', 'id': 1, 'addr': '北京', 'high': 188}
{'name': 'lixiang', 'addr': '北京', 'high': 188}
{'name': 'lixiang', 'addr': '北京'}
import pprint
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 正常输出 stus 字典
print(stus)
# 格式化输出 stus 字典,如果不设置 width,默认行宽是 80,如果不超过 80 输出显示和 print 一样
# indent = 4 代表设置缩进 4 个字符,width = 5,代表长度是 5
pprint.pprint(stus, indent=4, width=5)
运行结果:
{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188}
{ 'addr': '北京',
'age': 18,
'high': 188,
'id': 1,
'name': 'lixiang'}
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 清空字典
stus.clear()
print(stus)
运行结果:
{}
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 删除字典,执行后字典不再存在
del stus
print(stus)
运行结果:
Traceback (most recent call last):
File "/Users/zhulixiang/Downloads/pythonProject/thz/Day02/字典.py", line 55, in
print(stus)
NameError: name 'stus' is not defined
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# 字典所有的 values
stus.values()
print(stus.values())
# 字典所有的 keys
stus.keys()
print(stus.keys())
运行结果:
dict_values(['lixiang', 1, 18, '北京', 188])
dict_keys(['name', 'id', 'age', 'addr', 'high'])
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
# stus.items() 把字典转换成二维数组,二维数组的每个元素就是字典的 key 和 value
print(stus.items())
运行结果:
dict_items([('name', 'lixiang'), ('id', 1), ('age', 18), ('addr', '北京'), ('high', 188)])
import pprint
stus = {
"name": "lixiang",
"id": 1,
"age": 18,
"addr": "北京",
"high": 188
}
stus2 = {"money": 2}
# 把一个字典里面的值,放到另一个字典里面
stus.update(stus2)
pprint.pprint(stus, width=10)
运行结果:
{'addr': '北京',
'age': 18,
'high': 188,
'id': 1,
'money': 2,
'name': 'lixiang'}
import pprint
info = {
'chenxue':{
'age': 18,
'addr': 'beijing',
'cars': ['bmw','ben-z','audi']
},
'wanghusai': {
'house': {
'bj': ['海淀区','昌平区','朝阳区','西城区'],
'sh': ['静安区','闸北区']
},
'money': 5000
}
}
# chengxu 增加一辆车 car
info['chenxue']["cars"].append("tesila")
pprint.pprint(info,width=10)
print()
# wangshuai 买了昌平一套房,存款增加了 3000000
info['wanghusai']['house']['bj'].remove('昌平区')
info['wanghusai']['money'] = 3005000
pprint.pprint(info,width=10)
运行结果:
{'chenxue': {'addr': 'beijing',
'age': 18,
'cars': ['bmw',
'ben-z',
'audi',
'tesila']},
'wanghusai': {'house': {'bj': ['海淀区',
'昌平区',
'朝阳区',
'西城区'],
'sh': ['静安区',
'闸北区']},
'money': 5000}}
{'chenxue': {'addr': 'beijing',
'age': 18,
'cars': ['bmw',
'ben-z',
'audi',
'tesila']},
'wanghusai': {'house': {'bj': ['海淀区',
'朝阳区',
'西城区'],
'sh': ['静安区',
'闸北区']},
'money': 3005000}}
user_info = """
aDMin,123456
teSt1,abc123
xiaoHei,xxxx434
"""
d = dict(x.split(",") for x in user_info.split())
print(d)
运行结果:
{'aDMin': '123456', 'teSt1': 'abc123', 'xiaoHei': 'xxxx434'}
user_info = """
aDMin,123456
teSt1,abc123
xiaoHei,xxxx434
"""
d = dict(x.split(",") for x in user_info.split())
print(d)
new_d = {}
for i in d:
new_d[i.lower()] = d[i]
print(new_d)
运行结果:
{'aDMin': '123456', 'teSt1': 'abc123', 'xiaoHei': 'xxxx434'}
{'admin': '123456', 'test1': 'abc123', 'xiaohei': 'xxxx434'}
d = {"admin": "123456", "test": "456789"}
# 这种方法效率比较高,因为是直接根据 key:value 取值
for i in d:
print(i, d.get(i))
# 使用 item 的效果效率比较低,因为使用 item 时时先把字典转换成 list,然后才逐一去取list 的每个元素
for k, v in d.items():
print(k, v)
运行结果:
admin 123456
test 456789