一、数据类型的划分:
python中的数据类型划分为:
可变的数据类型: list , 字典,set(集合)
不可变的数据类型:元组 , int ,bool ,str (字符串是不可变的类型,因为对字符串的修改是创建了一个新的字符串,而不是在原有的字符串的基础上进行改变) 可哈希
二:字典简介
字典有键值对(键和值)组成,和数据库中的主键有些类似,一个键对应的一个值。
键:因为一个键确定值,所以键是不能改变的数据类型 (int ,bool ,str,元组) 都可以作为键的类型
值:字典的值可以是任何类型
优点:字典是无序的,但是字典中的键是有序排列的。而且,字典在查找的时候,在键中优先采用二分法进行查找,所以字典的查找速率很快。
特点:字典的存储是无序的,有点分布式数据库的意思。
三:字典的创建
字典的格式:一般用大括号括起来,键于值之间用冒号连接
1 dic = { 2 键1 :值1, 3 键2 : 值2, 4 }
代码演示:
1 dic = { 2 "name":["huao","zhao"], 3 '计科':[{"name":"胡澳",'age':18}, 4 {"name":"胡澳",'age':19} 5 ], 6 True:1, 7 (1,2,3):"胡澳", 8 2:"二哥" 9 } 10 print(dic)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py {'name': ['huao', 'zhao'], '计科': [{'name': '胡澳', 'age': 18}, {'name': '胡澳', 'age': 19}], True: 1, (1, 2, 3): '胡澳', 2: '二哥'} 进程已结束,退出代码0
解析:字典的创建中,键用了(str, bool,tuple,int )等一系列的不可变的数据类型
而值得创建则是用了不同得数据类型,任意得数据类型都可以。
四、字典的增删改查
增:
代码演示:
dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} dic["weigth"] = 120 #如果这个键值对没有的话,会直接添加到字典里面 dic["age"] = 19 #有这个键值对会直接覆盖掉原来的值 ''' def setdefault(self, *args, **kwargs): # real signature unknown """ Insert key with a value of default if key is not in the dictionary. Return the value for key if key is in the dictionary, else default. """ pass 如果键不在字典中,则使用默认值进行插入。 如果键在字典中,则返回键的值,否则直接插入默认值 ''' dic.setdefault('weight') #字典中有weight这个键,但是没有指定值,所以直接用默认值添加(默认值就是None) dic.setdefault("name","赵润全") print(dic)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py {'name': '胡澳', 'age': 19, '班级': '17级计科六班', 'weigth': 120, 'weight': None} 进程已结束,退出代码0
分析:字典中的增加的方法大致上和列表差不多。
删:
pop(有键,删除并返回删除值。没键,报错):
代码演示:
1 dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} 2 ''' 3 def pop(self, k, d=None): # real signature unknown; restored from __doc__ 4 """ 5 D.pop(k[,d]) -> v, remove specified key and return the corresponding value. 6 If key is not found, d is returned if given, otherwise KeyError is raised 7 """ 8 pass 9 找到了就删除并返回被删除的值。没有找到就报错 10 ''' 11 dic1 = dic.pop('name') # pop有返回值。返回的是被删除的键所对应的值。 12 dic2 = dic.pop('weight') #没有找到就报错了 13 print(dic1)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py Traceback (most recent call last): File "D:/学习资料/项目/练习/lianxi.py", line 11, in <module> dic2 = dic.pop('weight') KeyError: 'weight' 进程已结束,退出代码1
popitem(随机删除并返回键和值组成的元组,没找到键就进行报错):
代码演示:
1 dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} 2 dic.setdefault("weight",60) 3 ''' 4 def popitem(self): # real signature unknown; restored from __doc__ 5 """ 6 D.popitem() -> (k, v), remove and return some (key, value) pair as a 7 2-tuple; but raise KeyError if D is empty. 8 """ 9 pass 10 删除并且返回被删除的键和值。返回的是一个元组,里面包含键值对。 11 如果没有找到键,则会报错。 12 ''' 13 print(dic) 14 dic1 = dic.popitem() #随机删除(说着是随机删除,但实际上是删除最后一个) 15 print(dic) 16 print(dic1)
运行截图:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py {'name': '胡澳', 'age': 20, '班级': '17级计科六班', 'weight': 60} {'name': '胡澳', 'age': 20, '班级': '17级计科六班'} ('weight', 60) 进程已结束,退出代码0
del:
代码演示:
dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} del dic["name"] print(dic) del dic print(dic)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py Traceback (most recent call last): File "D:/学习资料/项目/练习/lianxi.py", line 5, in <module> print(dic) {'age': 20, '班级': '17级计科六班'} NameError: name 'dic' is not defined 进程已结束,退出代码1
代码分析:del删除和在列表中的一样。在字典中的删除的时候,直接删除键就行,因为键是对应的映射到值上面的。
clear(直接就是清空字典):
代码演示:
dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} dic.clear() print(dic)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py {} 进程已结束,退出代码0
代码分析:运用clear进行删除的时候,完全删除后并不会直接进行报错,而是返回一个空的字符串。
改:
update(将dic1中的值更新到dic中,没有键的添加,有相同的键的进行覆盖):
代码演示:
dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} dic1 = {"name":"赵润全","weight":20} dic.update(dic1) print(dic)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py {'name': '赵润全', 'age': 20, '班级': '17级计科六班', 'weight': 20} 进程已结束,退出代码0
代码分析:dic1中有和dic中一样的键name,所以更新后就会覆盖dic中的值(胡澳)成为(赵润全)。dic中没有的键值对weight就直接添加到dic中。
查:
先介绍一下字典的常规查询。
代码演示:
1 dic = {"name":"胡澳","age":20,"班级":"17级计科六班"} 2 print(dic.keys(),type(dic.keys())) 3 print(dic.values(),type(dic.values())) 4 print(dic.items(),type(dic.items())) 5 6 for i in dic: 7 print(i)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py dict_keys(['name', 'age', '班级']) <class 'dict_keys'> dict_values(['胡澳', 20, '17级计科六班']) <class 'dict_values'> dict_items([('name', '胡澳'), ('age', 20), ('班级', '17级计科六班')]) <class 'dict_items'> name age 班级 进程已结束,退出代码0
代码分析:可以看出,字典中的键和值都是独立类型的存在。用for去遍历字典的时候,打印的是字典的键。字典的键和值打印出来也是列表,使用方法和列表一样。
交换赋值(a,b = b,a):
代码演示:
a = 10 b = 20 a,b = b,a print(a,b)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py 20 10 进程已结束,退出代码0
代码分析:在别的语言中交换两个变量的值得用三个变量,需要有一个中间变量进行过度。但是在python中直接交换就行。
因为在python中的存储如图:
除了存储了每个变量的内存地址以外。还存储了变量的对应关系。所以在交换的时候,直接将变量的对应关系进行交换,然后在根据名字再去找对应的内存地址,就可以交换。实质上内存地址并没有变化,只是对应关系发生了变化。
而在python中这一交换的特性被放大:
代码演示:
a,b = [1,2,3],[4,5,6] print(a) print(b) a,b = (2,3) print(a) print(b)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py 20 10 [1, 2, 3] [4, 5, 6] 2 3 进程已结束,退出代码0
代码分析:可以看出,a,b两边都可以进行配对,只要是对应的,左边变量数量和右边的相等就行。
分别打印键和值:
代码演示:
dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"} for k,v in dict.items(): print(k,v)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py name 胡澳 age 10 班级 计算机与技术专业 进程已结束,退出代码0
通过键值直接查询:
代码演示:
dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"} a = dict["name"] print(a)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py 胡澳 进程已结束,退出代码0
但是没有找到键值的话就会报错。
dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"} a = dict["weight"] print(a)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py Traceback (most recent call last): File "D:/学习资料/项目/练习/lianxi.py", line 2, in <module> a = dict["weight"] KeyError: 'weight' 进程已结束,退出代码1
Get :get的出现缓解了报错的现象
代码演示:
dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"} ''' def get(self, *args, **kwargs): # real signature unknown """ Return the value for key if key is in the dictionary, else default. """ pass 如果找到了键就返回值,如果没有就返回默认值 ''' a1 = dict.get("name") print(a1) a2 = dict.get("weight") print(a2) a3 = dict.get("weight","没有这个键") print(a3)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py 胡澳 None 没有这个键 进程已结束,退出代码0
代码分析:可以看出get的返回值是None,也可以字节在后面设一个返回的默认值。这就比较好的解决了报错的问题。因为你有时也不知道,拿过来的数据有没有这个键。
五、字典的嵌套:
字典的嵌套和列表的嵌套一样,找准当前是在哪一个层次上面,出来的是列表还是字典,运用相关的方法进行操作就行。
代码演示:
dict = { "name":["胡澳","赵润全","丁瑶","陈毅"], "计科六班":{ "people1":{"name":"胡澳","age":19,"班级":"计算机科学与技术"}, "people2":{"name":"赵润全","age":19,"班级":"计算机科学与技术"} }, "age":19 } #将name中的胡澳替换成huao dict["name"][0] = "huao" print(dict) #在people1中加入爱好 dict["计科六班"]["people1"].setdefault("兴趣爱好","打篮球") print(dict)
运行结果:
D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py {'name': ['huao', '赵润全', '丁瑶', '陈毅'], '计科六班': {'people1': {'name': '胡澳', 'age': 19, '班级': '计算机科学与技术'}, 'people2': {'name': '赵润全', 'age': 19, '班级': '计算机科学与技术'}}, 'age': 19} {'name': ['huao', '赵润全', '丁瑶', '陈毅'], '计科六班': {'people1': {'name': '胡澳', 'age': 19, '班级': '计算机科学与技术', '兴趣爱好': '打篮球'}, 'people2': {'name': '赵润全', 'age': 19, '班级': '计算机科学与技术'}}, 'age': 19} 进程已结束,退出代码0
代码分析:字典的嵌套和列表的嵌套其实相差不大,关键值找准在哪一个层次上,当前层次是那个类型,有什么方法。