Day 07 字典类型
文章目录
1.字典(dict)
字典是一个无需、键不重复、元素只能是键值对的可变的容器.
data = {"a":1,"b":2}
- 容器
- 元素必须键值对
- 键不重复,重复会被覆盖
data = {"a":1,"b":1}
print(data)
#{'a': 2}
- 无序(在Python3.6+字典就是有序了,之前的字典都是无序)
1.1 定义
v = {}
v1 = dict()
data = {"a":1,"b":2}
info = {
"name":"Ken",
"age":24,
"hobby":["computer","music"]
}
字典中对键值得要求:
- 键:必须可哈希。目前为止学到的可哈希的类型: int/bool/str/tuple,不可哈希的类型:list/set/dict。
- 值:任意类型。
data_dict = {
"ken":24
True:5
123:5
(11,22,33):5
}
- 特别的如下:
data_dict = {
1: 1,
True: 1
}
print(data_dict)
#{1: 1}
- 一般情况下当我们想要表示一组固定信息时,用字典可以更加的直观,例如:
#用户列表
user_list = {"admin":123,"root":111}
user_list = [{"name":"adimin","pwd":123},{"name":"root","pwd":123}]
1.2 独有功能
1.2.1 获取值
info = {
"name":"Ken",
"age":24,
"hobby":["computer","music"]
}
data = info.get("name")
print(data)
#Ken
data1 = info.get("email")#对于不存在的键,get最终得到的是None
print(data1)
#None
#案例
user_list = {
"Ken" : "123",
"Pitter":321
}
username = input("请输入用户名:")
password = input("请输入密码:")
mid_value = user_list.get(username)#获取对应键所对应的值
if mid_value == None:
print("用户不存在!")
else:
#print(mid_value)
if password == mid_value:
print("Login Successful!")
else:
print("Login failur!")
1.2.3 获取所有的键
info = {
"name":"Ken",
"age":24,
"hobby":["computer","music"]
}
data = info.keys()
#dict_keys(['name', 'age', 'hobby'])
- 在Python2中字典.keys()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。
- 可以判断键是否存在
info = {
"name":"Ken",
"age":24,
"hobby":["computer","music"]
}
for item in info.keys():
print(item)
1.2.4 获取所拥有的值
info = {
"name":"Ken",
"age":24,
"hobby":["computer","music"]
}
data = info.values()
print(data1)
#dict_values(['Ken', 24, ['computer', 'music']])
for item in info.values():
print(item)
#Ken
#24
#['computer', 'music']
1.2.5 所有的键值
for key,value in info.items():
print(key,value)
#name Ken
#age 24
#hobby ['computer', 'music']
1.2.6 设置值
dict_list = {"name":"张三","Tall":180}
dict_list.setdefault("age",24)
print(dict_list)
dict_list.setdefault("name","GG")
print(dict_list)
#{'name': '张三', 'Tall': 180, 'age': 24}
#{'name': '张三', 'Tall': 180, 'age': 24}
由上我们可以知道:
- 通过setdefault对字典的键值对进行添加
- 当我们设置的键值对的键与字典中原有的键值对中的键相同时默认不在添加设置的值
1.2.7 更新键值对
dict_list = {"name":"张三","Tall":180}
print(dict_list)
dict_list.update({"name":"李四","Tall":182,"age":18})
print(dict_list)
#{'name': '张三', 'Tall': 180}
#{'name': '李四', 'Tall': 182, 'age': 18}
通过观察上方代码我们可以知道:
- 字典通过update()更新键值对
- 更新时,通过输入与原字典内相同键的不同值的键值对的方式来更新
- 若更新的键值对里存在元字典内不存在的键则自动添加到字典内
1.2.8 移除指定键值对
dict_list.update({"name":"李四","Tall":182,"age":18})
dict_list.pop("age")
print(dict_list)
#{'name': '张三', 'Tall': 180}
观察代码可知:
- 字典通过pop()移除指定键值对
- 移除时只需示出键即可实现
1.2.9 按照顺序移除键值对
dict_list.update({"name":"李四","Tall":182,"age":18})
print(dict_list)
dict_list.popitem()
print(dict_list)
dict_list.popitem()
print(dict_list)
dict_list.update({"age":18})
print(dict_list)
dict_list.popitem()
print(dict_list)
# {'name': '李四', 'Tall': 182, 'age': 18}
# {'name': '李四', 'Tall': 182}
# {'name': '李四'}
# {'name': '李四', 'age': 18}
# {'name': '李四'}
观察可知:
- python通过popitem()进行对键值对的按顺序删除
- 删除时按照从后往前的顺序,也可以理解为后进先出
另外:
- py3.6后,popitem移除最后的值。
- py3.6之前,popitem随机删除。
#练习题
header = ['股票名称', '当前价', '涨跌额']
stock_dict = {
'SH601778': ['中国晶科', '6.29', '+1.92'],
'SH688566': ['吉贝尔', '52.66', '+6.96'],
'SH688268': ['华特气体', '88.80', '+11.72'],
'SH600734': ['实达集团', '2.60', '+0.24']
}
for key,value in stock_dict.items():
#print(key,value)
text_list = []
for index in range(len(value)):
text = "{}:{}".format(header[index],value[index])
text_list.append(text)
data = "、".join(text_list)
#print(data)
result = "{},{}.".format(key,data)
print(result)
# SH601778,股票名称:中国晶科、当前价:6.29、涨跌额:+1.92.
# SH688566,股票名称:吉贝尔、当前价:52.66、涨跌额:+6.96.
# SH688268,股票名称:华特气体、当前价:88.80、涨跌额:+11.72.
# SH600734,股票名称:实达集团、当前价:2.60、涨跌额:+0.24.
1.3 公共功能
1.3.1 求并集(python3.9新加入)
v1 = {"a":1,"b":2}
v2 = {"b":21,"c":2}
v3 = v1 | v2
print(v3)
#{'a': 1, 'b': 21, 'c': 2}
- 当进行并集操作时,遇到相同键时,会将相同键的值更新,并生成新的字典
1.3.2 长度
v1 = {"a":1,"b":2}
v2 = {"b":21,"c":2}
v3 = v1 | v2
print(v3)
print(len(v3))
#3
1.3.4 是否包含
dict_list = {'name': '李四', 'Tall': 182, 'age': 18}
v1 = "age" in dict_list
print(v1)
v2 = "age" in dict_list.keys()
print(v2)
#True
True
1.3.5 索引(键)
不同于元组和列表,字典的索引是键
dict_list = {'name': '李四', 'Tall': 182, 'age': 18}
print(dict_list['name'])
print(dict_list['Tall'])
print(dict_list['age'])
#李四
#182
#18
1.3.6 根据键 添加或修改 值
dict_list = {'name': '李四', 'Tall': 182, 'age': 18}
dict_list['name'] = "王二麻子"
dict_list["Hobby"] = {"football","Music"}
print(dict_list)
#{'name': '王二麻子', 'Tall': 182, 'age': 18, 'Hobby': {'Music', 'football'}}
由上我们可以观察到:
- 我们通过键来进行值的确定
- 当我们更新的值的键存在时,则会更新原来的键值对中的值
- 若不存在就添加键值对
1.3.7 for循环
由于字典也属于是容器,内部可以包含多个键值对,可以通过循环对其中的:键、值、键值进行循环;
dict_list = {'name': '王二麻子', 'Tall': 182, 'age': 18, 'Hobby': {'Music', 'football'}}
for item in dict_list:
print(item)
# name
# Tall
# age
# Hobby
1.3.8 字典的删除
dict_list = {'name': '王二麻子', 'Tall': 182, 'age': 18, 'Hobby': {'Music', 'football'}}
#del dict_list['name']
#data = dict_list.pop("name")
print(dict_list)
print(data)
#若不存在便会报错
#del dict_list['name']
# KeyError: 'name'
#data = dict_list.pop("name")
#KeyError: 'name'
1.4 转换
v1 = {{"k1","aa"},{"k2","bb"}}
v2 = {("k1","aa"),("k2","bb")}
print(dict(v1))
print(dict(v2))
#{'k1': 'aa', 'k2': 'bb'}
#{'k1': 'aa', 'k2': 'bb'}
dict_list = {'name': '王二麻子', 'Tall': 182, 'age': 18, 'Hobby': {'Music', 'football'}}
print(list(dict_list))
print(list(dict_list.keys()))
print(list(dict_list.values()))
print(list(dict_list.items()))
# ['name', 'Tall', 'age', 'Hobby']
# ['name', 'Tall', 'age', 'Hobby']
# ['王二麻子', 182, 18, {'football', 'Music'}]
# [('name', '王二麻子'), ('Tall', 182), ('age', 18), ('Hobby', {'football', 'Music'})]
1.5 其他
1.5.1存储原理
1.5.2 嵌套
- 字典的键必须可哈希。(list/set/dict不可哈希)
- 字典的值可以是任何类型
- 字典的键必须可哈希。(list/set/dict不可哈希)
- 字典的键和集合的元素在遇到布尔值和1、0时,需注意重复的情况。
- 元组的元素不可以被替换。
dic = {
"name ": '汪峰',
'age': 48,
'wife': [{'name': '国际章', 'age': 38}, {'name': '李杰', 'age': 48}],
'children': ['第一个娃', '第二个娃']
}
# 1,获取汪峰的妻子名字
d1 = dic['wife'][0]['name']
print(d1)
# 2.获取汪峰的孩子们
d2 = dic['children']
print(d2)
# 3。获取汪峰的第一个孩子
d3 = dic['children'][0]
print(d3)
# 4。汪峰的媳妇姓名变更为章子怡
dic['wife'][0]["name"] = "章子怡"
print(dic)
# 5。汪峰再娶一任妻子
dic["wife"].append({"name": "铁锤", "age": 19})
print(dic)
# 6。给汪峰添加一个爱好:吹牛逼
dic['hobby'] = '吹牛逼'
print(dic)
# 7.删除汪峰的年龄
del dic['age']
#dic.pop('age')
print(dic)
# 国际章
# ['第一个娃', '第二个娃']
# 第一个娃
# {'name ': '汪峰', 'age': 48, 'wife': [{'name': '章子怡', 'age': 38}, {'name': '李杰', 'age': 48}], 'children': ['第一个娃', '第二个娃']}
# {'name ': '汪峰', 'age': 48, 'wife': [{'name': '章子怡', 'age': 38}, {'name': '李杰', 'age': 48}, {'name': '铁锤', 'age': 19}], 'children': ['第一个娃', '第二个娃']}
# {'name ': '汪峰', 'age': 48, 'wife': [{'name': '章子怡', 'age': 38}, {'name': '李杰', 'age': 48}, {'name': '铁锤', 'age': 19}], 'children': ['第一个娃', '第二个娃'], 'hobby': '吹牛逼'}
# {'name ': '汪峰', 'wife': [{'name': '章子怡', 'age': 38}, {'name': '李杰', 'age': 48}, {'name': '铁锤', 'age': 19}], 'children': ['第一个娃', '第二个娃'], 'hobby': '吹牛逼'}