Python3学习之路~2.4 字典操作
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
定义字典(dictionary)
info = { 'stu1101': "Amy", 'stu1102': "Bob", 'stu1103': "Cindy" }
字典的特性:
- dict是无序的
- key必须是唯一的,so 天生去重
- 查询速度快,比列表快多了
- 比list占用内存多
为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法
dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。
增加
>>> info["stu1104"]="David" #增加 >>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
删除
>>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'} >>> info.pop("stu1101") #标准删除 'Amy' >>> info {'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'} >>> del info["stu1103"] #换个姿势删除,del是Python自带的,想删谁就删谁 >>> info {'stu1102': 'Bob', 'stu1104': 'David'} >>> info.popitem() #随机删除 ('stu1104', 'David') >>> info {'stu1102': 'Bob'}
查找
>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"} >>> "stu1102" in info #标准用法,判断一个key是否在字典中存在 True >>> info.get("stu1102") #获取 'Bob' >>> info["stu1102"] #同上,但是看下面 'Bob' >>> info.get("stu1105") #key不存在返回None >>> print(info.get("stu1105")) None >>> info["stu1105"] #key不存在就报错,慎用 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'stu1105'
修改
>>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy'} >>> info["stu1101"]="Alex" #修改 >>> info {'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy'}
其他
>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"} >>> info.values() #输出字典中所有的value dict_values(['Amy', 'Bob', 'Cindy']) >>> info.keys() #输出字典中所有的key dict_keys(['stu1101', 'stu1102', 'stu1103']) >>> info.setdefault("stu1106","xiaoming") #查找字典中是否有stu1106,若没有则创建并为其赋值为xiaoming 'xiaoming' >>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'} >>> info.setdefault("stu1101","Alex") #查找字典中是否有stu1101,若有,返回其值,且不修改 'Amy' >>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'} >>> b={1:2,3:4,'stu1101':'Alex'} >>> info.update(b) #两个字典表合并,若key有交叉则覆盖其值 >>> info {'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming',1: 2, 3: 4} >>> info.items() #字典转成列表 dict_items([('stu1101', 'Alex'), ('stu1102', 'Bob'), ('stu1103', 'Cindy'), ('stu1106', 'xiaoming'), (1, 2), (3, 4)]) >>> dict.fromkeys([1,2,3],'test') #通过一个列表生成默认dict,最好少用,因为有个不好解释的坑,如下 {1: 'test', 2: 'test', 3: 'test'} >>> >>> c=dict.fromkeys([1,2,3],'test') >>> c {1: 'test', 2: 'test', 3: 'test'} >>> c[1]="aaa" #无嵌套时,只修改1对应的value >>> c {1: 'aaa', 2: 'test', 3: 'test'} >>> c=dict.fromkeys([6,7,8],["aa",{"name":"Alex"},"bb"]) >>> c {6: ['aa', {'name': 'Alex'}, 'bb'], 7: ['aa', {'name': 'Alex'}, 'bb'], 8: ['aa', {'name': 'Alex'}, 'bb']} >>> c[7][1]["name"]="jack" #多层嵌套时,所有的key对应的value都修改,类似于列表的copy方法 >>> c {6: ['aa', {'name': 'jack'}, 'bb'], 7: ['aa', {'name': 'jack'}, 'bb'], 8: ['aa', {'name': 'jack'}, 'bb']}
循环dict
>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"} >>> for key in info: ... print(key,info[key]) #方法1,高效,建议使用 ... stu1101 Amy stu1102 Bob stu1103 Cindy >>> for k,v in info.items(): ... print(k,v) #方法2,会先把dict转成list,数据里大时莫用 ... stu1101 Amy stu1102 Bob stu1103 Cindy >>>
多级字典嵌套及操作
...