6,字典(dict)
字典是 无序、键不重复 且 元素只能是键值对的可变的 个 容器。
data = { "k1":1, "k2":2 }
-
容器
-
元素必须键值对
-
键不重复,重复则会被覆盖
data = { "k1":1, "k1":2 } print(data) # {"k1":2}
-
无序(在Python3.6+字典就是有序了,之前的字典都是无序。)
data = { "k1":1, "k2":2 } print(data)
6.1 定义
字典中对键值得要求:
-
键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。(集合)
-
值:任意类型。
data_dict = { "木木":18, A : 50 123:5, (3, 6, 9):["木木","小林"] }
一般在什么情况下会用到字典呢?
当我们想要表示一组固定信息时,用字典可以更加的直观,例如:
# 用户列表 user_list = [ ("mm","18"), ("amin","999") ]
user_list = [ { "name":"mm", "pwd":"693"}, { "name":"clic", "pwd":"789" } ]
6.2独有功能
1,获取值
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } player = user.get("name") #键不存在,则返回None print(player)
2,所有的键
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } data = user.keys() print(data)
注:在python2中字典.keys()直接获取的是列表,在python3中返回的是高仿列表,且这个高仿列表可以被循环
-
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } for ele in user.keys(): print(ele)
3,所有的值
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } data = user.values() print(data)
注:在python2中字典.values()直接获取的是列表,在python3中返回的是高仿列表,且这个高仿列表可以被循环
4,所有的键值
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } for item in user.items(): print(item[0], item[1]) # item是一个元组 (键,值)
5,设置值
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } user.setdefault("age", 18) print(user)
6,更新字典键值对
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } user.update({"age":18, "li":88}) #字典user中没有的键直接添加,有的键则更新值 print(user)
7,移除指定键值对
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } user.pop({"pwd":"789"}) #会有返回值,可以用变量接收 print(user)
8,按照顺序移除(后进先出)
user = { "name":"mm", "pwd":"693", "name":"clic", "pwd":"789", } data = user.popitem({"pwd":"789"}) print(user) print(data)
-
py3.6后,popitem移除最后的值。
-
py3.6之前,popitem随机删除。
6.3公共功能
1,求并集
(Python3.9新加入)
v1 = {"a": 1, "b": 3} v2 = {"a": 2, "c": 4} v3 = v1 | v2 #如果有重复的,|后面的字典的值就会把前面字典的值覆盖 print(v3)
2,长度
v1 = {"a": 1, "b": 3} d = len(v1) print(d)
3,是否包含
v2 = {"a": 2, "c": 4} v1 = "a" in info print(v1) v3 = "c" in v2.keys() print(v2) if "a" in v2: pass else: pass
4,索引(键)
字典不同于元组和列表,字典的索引是键
,而列表和元组的所有则是 0、1、2等数值
。
v1 = {"a": 1, "b": 3} print(v1["a"]) #通过键为索引时,键不存在会报错,建议用get方法获取值
5,根据键 修改值 和 添加值 和 删除键值对
v1 = {"a": 1, "b": 3} #修改 v1["a"] = "2" #增加 v1["c"] = 4 #删除 del v1["b"] v1.pop("b") #以上操作想看结果需打印
6,for循环
v = {"a": 1, "b": 3} #取所有键 for key in v: print(key) for ietm in v.keys(): print(item) #取所有值 for value in v.value() print(value) #取所有键和值 for key, value in v.items(): print(key, value)
6.5转换
l = dict(list/set/tuple)
其他
1,存储原理
字典把键通过哈希处理,得到的数值求余得到存储位置,与集合类似,速度就很快
2,嵌套
字典:
字典的键必须可哈希(list/set/dict不可哈希)
字典的值可以是任意类型
字典的键和集合的元素在遇到布尔值和1,0时,要注意重复的情况
元组的元素不可以被替换
#练习题 """ SH601778,股票名称:中国晶科、当前价:6.29、涨跌额:+1.92。 SH688566,股票名称:吉贝尔、当前价:""" 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) l = [] for index in range(len(header)): t = "{}:{}".format(header[index], value[index]) # print(t) l.append(t) re = '、'.join(l) msg = "{},{}。".format(key, re) print(msg)
7,浮点型
1,类型转换时,浮点型转换为整型,会将小数部分去掉
2,保留小数后n位
a = 3.117456 b = round(a,4) print(b)#保留a后四位小数点同时还会四舍五入,结果:3.1175
3,因为浮点型的储存原理,所以会导致不够精准
3.1,浮点型会直接转换为二进制
3.2,让小数部分一直乘2,小于1则用结果继续乘,大于1则结果减1继续乘,等于1则结束
3.3,将得到的二进制用科学计数法表示,小数点前只保留一位
3.4,存储在电脑上,以32位为例,分为sign(1),exponent(8),fraction(23)
sign(1) 存正负,正数就存0,负数就存1
exponent(8) 存指数部分,可表数据范围:0-255,负数范围:-126~127,计算时让[指数+127]得到的值转换为二进制存储在这就行
fraction(23) 存科学计数法中小数点后的小数部分,因为最多存23位,所以导致不准确
4,需要精确小数计算时:
import decimal a = decimal.Decimal("0.111") b = decimal.Decimal("0.222") c = a + b print(c) #0.333