Python基础数据类型:字典dict
程序员文章站
2022-03-20 20:24:59
Python基础数据类型:字典dict 01 内容大纲 字典的初识 字典的使用(增删改查) 字典的嵌套 02 具体内容 字典的初识: why: 列表可以存储大量的数据,数据之间的关联性不强 ['太白', 18, '男', '大壮', 3, '男'] 列表的查询速度比较慢。 what:容器型数据类型: ......
python基础数据类型:字典dict
01 内容大纲
- 字典的初识
- 字典的使用(增删改查)
- 字典的嵌套
02 具体内容
-
字典的初识:
-
why:
- 列表可以存储大量的数据,数据之间的关联性不强
- ['太白', 18, '男', '大壮', 3, '男']
- 列表的查询速度比较慢。
- 列表可以存储大量的数据,数据之间的关联性不强
what:容器型数据类型:dict。
-
how:
-
数据类型的分类(可变与不可变):
可变(不可哈希)的数据类型:list dict set
-
不可变(可哈希)的数据类型: str bool int tuple
-
不可变是指该对象本身是不可变的,在内存中自始至终未变化。
-
比如,对字符串的任何操作,对原对象没有任何改变。
s = 'alex' s2 = s.upper() print(s,s2)#alex alex s = 'alex' s = s.upper() print(s)#alex 变化的只是变量的指向
i = 100 i = 101 i = 102 #100,101,102都会在内存中占一定空间,变化的只是变量的指向。
-
-
-
字典:{}括起来,以键值对形式存储的容器型数据类型:
dic = {'太白': {'name': '太白金星','age': 18, 'sex': '男'}, 'python22期': ['朱光亚', '大壮', '雪飞', '岑哥'], }
键必须是不可变的数据类型:int , str (bool tuple几乎不用) 键要是唯一的
只能通过房间号(键)找到房间(值),房间内存什么数据都行
值可以是任意数据类型,对象。
字典3.5x版本之前(包括3.5)是无序的。
字典3.6x会按照初次建立字典的顺序排列,学术上不认为是有序的。
字典3.7x以后都是有序的。
字典的优点:查询速度非常快,存储关联性的数据。
字典的缺点:以空间换时间。
-
-
字典的创建方式:
面试会考:创建字典的三种方式 #dict查看源码 ctrl+左键 点击dict # 方式一: dic = dict((('one', 1), ('two', 2), ('three', 3))) #创建字典用dic = dic() 括号内包含一个大元组,用括号括起来, #大元组内部包含三个小元组,分别用3个括号括起来。用到了元组的拆包 dic = dict([('one',1),('two',2),('three',3)]) print(dic) # {'one': 1, 'two': 2, 'three': 3} # 方式二: dic = dict(one=1, two=2, three=3) print(dic) # 方式三: dic = dict({'one': 1, 'two': 2, 'three': 3}) #官方正规写法dic = dic() 括号内放了一个字典 print(dic) dic = {'one': 1, 'two': 2, 'three': 3} #平时上课的写法 # 方式四: dic = dict(zip(['one', 'two', 'three'],[1, 2, 3])) print(dic)#{'one': 1, 'two': 2, 'three': 3} # 方式五: 字典推导式 后面会讲到 dic = { k: v for k,v in [('one', 1),('two', 2),('three', 3)]} print(dic)#{'one': 1, 'two': 2, 'three': 3} # 方式六:利用fromkey dic = dict.fromkeys('abcd','太白') print(dic)#{'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
-
验证字典的合法性:
# 不合法 dic = {[1,2,3]: 'alex', 1: 666} # 键要不可变的数据类型 print(dic) #typeerror: unhashable type: 'list' dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key。typeerror: unhashable type: 'list' dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key。typeerror: unhashable type: 'dict' dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key。typeerror: unhashable type: 'set' dic = {1: 'alex', 1: '太白', 2: 'wusir'} # 键要唯一 print(dic) #{1: '太白', 2: 'wusir'}
-
字典的增删改查【掌握】
dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} # 增: # 直接增加 有则改之,无则增加 dic['sex'] = '男' #没有sex这个键,就增加键值对 print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车'], 'sex': '男'} dic['age'] = 23 # 改 :有age这个键,就成了字典的改值 print(dic)#{'name': '太白', 'age': 23, 'hobby_list': ['直男', '钢管', '开车']} # setdefault 有则不变,无则增加 dic.setdefault('hobby') print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车'], 'hobby': none} #none空 dic.setdefault('hobby', '球类运动')#无则增加:没有此键则添加 print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车'], 'hobby': '球类运动'} dic.setdefault('age', 45)#有则不变:有此键则不变 print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} # 删 # pop 按照键删除键值对, 有返回值,可以设置返回值;设置第二个参数则无论字典中有无此键都不会报错 ***【重点记】 dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} dic.pop('age') print(dic)#{'name': '太白', 'hobby_list': ['直男', '钢管', '开车']} ret = dic.pop('age') print(ret) #18 返回删除键对应的值 dic.pop('hobby') #报错 keyerror: 'hobby' #设置第二个参数则无论字典中有无此键都不会报错 ;pop返回值可以设置 ret = dic.pop('hobby','没有此键') print(ret)#没有此键 ret = dic.pop('hobby','哈哈') print(ret)#哈哈 (返回值) # popitem 3.5版本之前,popitem为随机删除,3.6之后为删除最后一个,有返回值 dic = {'name': '太白', 'age': 18} ret = dic.popitem() print(ret, dic) #('age', 18) {'name': '太白'} # clear 清空字典 ** dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} dic.clear() #把字典内容清空,不是把字典删除 print(dic) # del 通过键删除键值对 ** dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} del dic['age'] print(dic)#{'name': '太白', 'hobby_list': ['直男', '钢管', '开车']} #没有此键会报错 del dic['age1']#keyerror: 'age1' 报错 print(dic) # del dic 删除整个字典 dic = {'name': '太白', 'age': 18} del dic print(dic)# name 'dic' is not defined 因为字典被删除了 # 改:通过键值对直接改 dic['name'] = 'alex' print(dic) # update dic = {'name': '太白', 'age': 18} dic.update(sex='男',heigth=175) print(dic)#{'name': '太白', 'age': 18, 'sex': '男', 'heigth': 175} dic = {'name': '太白', 'age': 18} dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')]) print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'} dic1 = {"name":"jin","age":18,"sex":"male"} dic2 = {"name":"alex","weight":75} dic2.update(dic1) print(dic2)#{'name': 'jin', 'weight': 75, 'age': 18, 'sex': 'male'} dic1.update(dic2) print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75} # 查 #按键查值,缺点:没有键会报错,不建议用 #通过键查询,直接dic[key](没有此键会报错) dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} print(dic['hobby_list']) #['直男', '钢管', '开车'] print(dic['hobby_list1']) #报错 keyerror: 'hobby_list1' # get ***【重点记】 #没有键返回none,不会报错。可以设置返回值 dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']} l1 = dic.get('hobby_list') print(l1) #['直男', '钢管', '开车'] l1 = dic.get('hobby_list','没有此键') # 可以设置返回值: '没有此键'(返回值) print(l1)#['直男', '钢管', '开车'] l1 = dic.get('hobby_list1') print(l1) #none 没有键返回none,不会报错 l1 = dic.get('hobby_list1','没有此键') # 可以设置返回值 print(l1) #没有此键(返回值) # 三个特殊的 keys() values() items() # keys() # 一个高仿列表,存放的都是字典中的key print(dic.keys(),type(dic.keys())) #dict_keys(['name', 'age', 'hobby_list']) <class 'dict_keys'> # 可以转化成列表 print(list(dic.keys())) #['name', 'age', 'hobby_list'] #循环遍历,打印键: #1 for key in dic.keys(): print(key) #2 for key in dic: print(key) #结果: name age hobby_list # values() dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','钢管','开车']} #一个高仿列表,存放都是字典中的value print(dic.values())#dict_values(['taibai', 18, ['直男', '钢管', '开车']]) # 可以转化成列表 print(list(dic.values()))#['taibai', 18, ['直男', '钢管', '开车']] #循环遍历,打印值: for value in dic.values(): print(value) #结果: taibai 18 ['直男', '钢管', '开车'] # items() dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','钢管','开车']} # 一个高仿列表,存放是多个元祖,元祖中第一个是字典中的键,第二个是字典中的值 print(dic.items())#dict_items([('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '钢管', '开车'])]) # 可以转化成列表 print(list(dic.items())) #[('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '钢管', '开车'])] #循环遍历,打印所有键值对 for key,value in dic.items(): print(key,value) 结果: name taibai age 18 hobby_list['直男', '钢管', '开车'] #元组拆包,分别赋值 a,b = ('name', '太白') print(a,b) #面试题:用一行代码将a和b的值互换 a = 18 b = 12 a,b = b,a print(a,b)#12 18 a,b= 12,18 print(a,b)
-
字典的嵌套【掌握】
dic = { 'name': '汪峰', 'age': 48, 'wife': [{'name': '国际章', 'age': 38},], 'children': {'girl_first': '小苹果','girl_second': '小怡','girl_three': '顶顶'} } # # 1. 获取汪峰的名字。 print(dic['name']) print(dic.get('name')) # # 2.获取这个字典:{'name':'国际章','age':38}。 print(dic['wife'][0]) #{'name': '国际章', 'age': 38} print(dic.get('wife')[0])#{'name': '国际章', 'age': 38} # # 3. 获取汪峰妻子的名字。 print(dic.get('wife')[0].get('name'))#国际章 print(dic.get('wife')[0]['name'])#国际章 print(dic['wife'][0]['name'])#国际章 # # 4. 获取汪峰的第三个孩子名字。 print(dic.get('children').get('girl_three'))#顶顶 print(dic.get('children')['girl_three'])#顶顶 print(dic['children']['girl_three'])#顶顶
-