Python基础5/20篇:dict, 可变数据类型与不可变数据类型
来都来了,不关注一下吗??
今天我们学习基本数据类型之字典 dict, 在讲解之前呢,我需要详细给大家串一下可变数据类型和不可变数据类型,之前有提到过呦
可变数据类型:当该数据类型对应变量的值发生变化时,对应内存地址并没有开辟新的内存,而是在原来的内存值上进行修改,也可以叫做不可哈希的。(哈希hash是一种算法,知道这种说法即,可不用细究)
不可变数据类型:当该数据类型对应变量的值发生变化时,原来内存中的值不变,而是会开辟一块新的内存,变量指向新的内存地址。
可变数据类型有: list dict set (不可哈希)
不可变数据类型有:tuple,bool,int,str (可哈希)
好了有了这些预备知识,我们下面正式进入字典的学习啦好好理解哦。
(六)字典 dict
1初识dic
t
字典(dict)是python中唯⼀一的⼀一个映射类型,是以{ }括起来的键值对组成。在dict中key是唯⼀一的,在保存的时候, 根据key来计算出⼀一个内存地址, 然后将key-value保存在这个地址中,这种算法被称为hash算法。所以,切记,在dict中存储的key-value中的key必须是可hash的。
如果你还还还还还搞不懂什什么是可哈希, 暂时可以这样记:可以改变的都是不可哈希的,那么可哈希就意味着不可变。这个是为了能准确的计算内存地址而规定的。
语法 :{key1: value1, key2: value2....}
dict 优点 :可以存储大量的关系型数据
特点:无序
!注意: key必须是不可变(可哈希)的. value没有要求.可以保存任意类型的数据
这是一个dic的示例:
dic = {"name" : ["sissi", "alex"],"info" : [{"num":7, "ave_age":18}],
True : 1,(1,2,3) : "123",4 : "男神"}print(dic)
输出结果
2增删改查
(1)增
1)直接加 dic[key] = value
【特点:新增加的key不在原dict的是添加,在的话是覆盖】
dic = {"name":"sissi", "age":25}dic["high"] = 170 # 增加一个键值,增加身高为170print(dic)
输出结果
如果原字典里有新加的key,则会覆盖,比如
dic = {"name":"sissi", "age":25, "high":170}dic["high"] = 180print(dic)
输出结果
2)dic.setdefault(key, value)
【特点:新增加的key不在原dict的是添加,在的话是保留原值】
dic = {"name":"sissi", "age":25, "high":170}dic.setdefault("weight", 110) # 没有,添加dic.setdefault("name", "alex") # 有, 保留原来,不做任何改变print(dic)
输出结果
(2)删
1)按key删 dic.pop(key)
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic.pop("age") # 删除age, 有返回值print(dic)
输出结果
若删除一个不在原列表的key,会报错:
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic.pop("gender") # 删除genderprint(dic)
输出结果
如果我们不想让它报错,可以设置返回值:
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic.pop("gender", None) # 删除gender,如果没有则返回Noneprint(dic.pop("gender", None))print(dic)
输出结果
再比如:
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic.pop("gender", "没有此键") # 删除gender,如果没有则返回没有此键print(dic.pop("gender", "没有此键"))print(dic)
输出结果
2)随机删除 dic.popitem()
【特点:有返回值,返回值是元组形式,里面是删除的键值】
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic.popitem() # 有返回值print(dic.popitem())print(dic)
输出结果
但是很多同学会质疑,因为发现它总是删除最后一个,在这里辟谣:其实真的是随机删除的,只是我们举例的dic里面包含的键值对比较少,如果字典里面包含大量的键值对,是很可能看到随机删除的,也可以参考python手册哈。
3)清空, dic.clear()
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic.clear()print(dic)
输出结果
4)用del删除 del dic[key]
dic = {"name":"sissi", "age":25, "high":170, "weight":110}del dic["name"]print(dic)
输出结果
当删除原dic里没有的key则会报错:
dic = {"name":"sissi", "age":25, "high":170, "weight":110}del dic["gender"]print(dic)
输出结果
(3)改
1)直接改 dic[key] = 新value
dic = {"name":"sissi", "age":25, "high":170, "weight":110}dic["age"] = 16 # 把年龄改为16岁print(dic)
输出结果
2)更新 dic2.update(dic) 把dic放进dic2中,更新dic2
dic = {"name":"sissi", "age":25, "high":170}dic2 = {"name":"alex", "weight":110}dic2.update(dic) # 把dic放进dic2print(dic)print(dic2)
输出结果
从输出结果可以看到,dic并没有变,而dic2变了。本质就是把dic放进dic1里面去,没有的添加,有的覆盖。
(4)查
1)直接打印key, value和键值对
dic = {"name":"sissi", "age":25, "high":170}print(dic.keys()) # 打印所有的keyprint(dic.values()) # 打印所有的valueprint(dic.items()) # 打印所有的键值
输出结果
2) 查找key
打印dic中的key的两种写法:
dic = {"name":"sissi", "age":25, "high":170}for i in dic: # 打印key print(i)
或者
dic = {"name":"sissi", "age":25, "high":170}for i in dic.keys(): # 打印key print(i)
输出结果均为
3)查找value
dic = {"name":"sissi", "age":25, "high":170}for i in dic.values(): # 打印value print(i)
输出结果
4)查找键值对
dic = {"name":"sissi", "age":25, "high":170}for i in dic.items(): # 打印键值对 print(i)
输出结果
把括号去了:
dic = {"name":"sissi", "age":25, "high":170}for k, v in dic.items(): # 打印键值对 print(k, v)
输出结果
6)打印原dic存在的value
6.1)用key找 dic[key]
dic = {"name":"sissi", "age":25, "high":170}v1 = dic["name"]print(v1)
输出结果
找不到则会报错:
dic = {"name":"sissi", "age":25, "high":170}v2 = dic["gender"]print(v2)
输出结果
6.2)用get找:dic.get(key)
dic = {"name":"sissi", "age":25, "high":170}v1 = dic.get("name")print(v1)
输出结果
找不到则返回None:
dic = {"name":"sissi", "age":25, "high":170}v2 = dic.get("gender")print(v2)
输出结果
3嵌套
字典的嵌套其实和列表非常相似,本质上就是根据它们各自的性质,一层一层看!
比如我的原dic为:
dic = {"name": "joy","info" : {"age" : 31,"gender" : "male","children" : ["alex", "volia"]
},"money" : 2000
}
1)现在我想把money改成3000:
# 把money改成3000dic["money"] = 3000print(dic)
输出结果
2)age改成35
# 把age改成35dic["info"]["age"] = 35print(dic)
首先要从info里面取出age,再从age里面取出35:
3)在info里面添加一个wife的信息
# 在info里面添加一个wife的信息dic["info"]["wife"] = "女神"print(dic)
同样的,首先先要找到info,再添加信息:
4)把children中的volia大写
# children中的volia大写dic["info"]["children"][1] =dic["info"]["children"][1].upper()print(dic)
首先从info中找到children,是一个列表形式,volia的index是1,按索引取出:
~~ 今天的内容很重要哦 ~~
记得关注喵~~
留言板