欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第六天 - 字典

程序员文章站 2022-03-26 14:29:16
1.字典简介 字典(dict) python中唯一的映射类型,根据key计算内存地址,再以key:value保存在这个地址里面 hash算法无序的 故而key必须是可hash的(如果你搞不懂什么是可哈希,暂可记成,可改变的都不可哈希的) 可哈希(不可改变)的数据类型: int,str,tuple,b ......

1.字典简介

  字典(dict) python中唯一的映射类型,根据key计算内存地址,再以key:value保存在这个地址里面

  hash算法无序的 故而key必须是可hash的(如果你搞不懂什么是可哈希,暂可记成,可改变的都不可哈希的)

  可哈希(不可改变)的数据类型: int,str,tuple,bool 

  不可哈希(可改变)的: list,dict,set

  字典的key必须是可哈希的,不可变 value随便改

1 # 语法 {key1:value1,key:value2,key:value3...}
2 dic ={123:456,true:999,"id":5,"name":"赛丽亚","stu":"精灵"}
3 print(dic)
4 dic ={[1,2,5]:666,}  # typeerror [1,2,5] list可变的

  注意:dict保存的数据不并是按我们添加进去的顺序保存的.是按hash表顺序保存的.而hash表不连续.

  所以不能进行切片工作.它只能通过key来获取dict中的数据

  

  字典的增删改查与其他操作:

dic = {123:456,true:999,"id":5,"name":"赛丽亚","stu":"精灵"}
1 # 1.增加
2 dic ["007"] = "666"  # 没有出现的key会添加上
3 dic ["001"] = "策划"
4 print(dic)
5 # .setdefault()
6 # 流程 先判断key是否存在 若存在 不执行新增 若不存在 执行新增
7 dic.setdefault("001","系统") # key不存在 新增
8 dic.setdefault("001","策划") # key存在 setdefault不新增
9 print(dic)

 

1 # 2.删除 .pop()  .popitem()  .clear()  del()
2 dic = {"张无忌":'倚天屠龙记', "紫薇":"还珠格格", "王语嫣":"天龙八部", "刘能":"乡村爱情协奏曲"}
3 dic.pop("刘能")  # 指定key删除
4 dic.pop("张无忌")
5 dic.popitem() # 随机删除
6 dic.popitem() # python3.5以上显示为 按输入顺序从最后一个删除 实际底层仍是无序随机删除的
7 dic.clear()  # 清空
8 del dic["刘能"]  # 类似pop 但底层也删掉了
9 print(dic)

 

1 # 3.修改 .update()
2 dic = {"张无忌":'倚天屠龙记', "紫薇":"还珠格格", "王语嫣":"天龙八部", "刘能":"乡村爱情协奏曲"}
3 dic ["刘能"] = "乡村爱情" # dic[已存在的key] = 新value  修改
4 print(dic)
5 dic1 ={"张无忌":"明教教主","紫薇":"还珠第二部","乔峰":"丐帮帮主"}
6 dic.update(dic1) # 把dic1的内容覆盖到dic中 存在的key修改value 不存在的新增
7 print(dic)

 

 1 # 4.查询
 2 # 一般用 key 来查找具体的数据
 3 dic = {"张无忌":'倚天屠龙记', "紫薇":"还珠格格", "王语嫣":"天龙八部", "刘能":"乡村爱情协奏曲"}
 4 print(dic["紫薇"])  # dic[key] 输出 value 还珠格格
 5 # print(dic["尔康"])  # 若key不存在 报错 keyerror: '尔康'
 6 print(dic.get("王语嫣"))  # dic.get[key] 输出 value 天龙八部
 7 print(dic.get("小燕子"))  # 若key不存在 不会报错 返回 none
 8 print(dic.get("刘能","没有"))  # 两个参数 若第一个参数不存在 返回第二个参数作为默认值 若存在 直接返回value
 9 
10 # setdefault() 新增
11 # 流程: 1.先检测是否存在 kye,xxx
12 #        2.根据你给的key查询value
13 dic = {"jay":"周杰伦"}
14 dic1 = dic.setdefault("jj","林俊杰")
15 print(dic1)

 

练习题

 1 # 把列表转化到字典里面去 key1:[大于66的数据], key2:[小于等于66]
 2 # dic = {key1:[大于66的],key2:[小于等于66]}
 3 方案1:
 4 dic ={"key1":[],"key2":[]}
 5 lis = [11,22,33,44,55,88,66,77,99]
 6 for i in lis:
 7     if i > 66:
 8         dic["key1"].append(i)
 9     else:
10         dic["key2"].append(i)
11 print(dic)
12 
13 
14 方案2:
15 lis = [11,22,33,44,55,88,66,77,99]
16 dic = {}
17 for i in lis:
18     if i > 66:
19         dic.setdefault("key1",[]).append(i)
20     else:
21         dic.setdefault("key2",[]).append(i)
22 print(dic)

 

  字典的相关操作 .keys() .values() .items()

 1 dic = {"dnf":"剑魂","lol":"钻石","龙之谷":"箭神","顺火暖":"九灵","剑网三":"天香"}
 2 
 3 print(dic.keys())  # 返回内容像列表 但不是列表
 4 for i in dic.keys():  # 可以迭代 拿到的是每一个key
 5     print(i)
 6 
 7 print(dic.values())  # 所有的value返回 像列表但不是列表
 8 for i in dic.values(): # 迭代 拿到的是每一个value
 9     print(i)
10 
11 print(dic.items())  # 返回键值对 (key,value)
12 for item in dic.items():
13     print(item)     # item是元组 (key,value)

  字典遍历最好方案:

 1 #好的遍历字典方案   *重点
 2 for k,v in dic.items():   # item是元组 (key,value)
 3     print(k,v)    # 解包 拿到key,value
 4 
 5 #相关知识 解构解包
 6 # a,b = 1,2  # 等同a,b = (1,2)
 7 a,b,c = 1,2,3
 8 print(a,b)
 9 
10 #真正的字典迭代
11 for k in dic:
12     print(k)  # 直接拿到的是key
13     print(dic[k])  # 拿到value

 

  字典嵌套:

  类似列表数框框,如:

 1 # 字典的嵌套
 2 dic = {
 3     "name":"汪峰",
 4     "age":48,
 5     "hobby":"抢头条",
 6     "代表作":["春天里","怒放的生命","存在"],
 7     "wife_now":{'name':'章子怡',
 8                 'age':'50',
 9                 '爱好':'打麻将'
10                 },
11     "children":[{'id':1,"name":"汪涵"},{"id":2,"name":"汪才"}]
12 }
13 print(dic["代表作"][2])
14 print(dic["wife_now"]["爱好"])
15 # 改名字
16 dic["children"][0]["name"] = "汪旺"
17 dic["children"][1]["name"] = "汪财"
18 print(dic)

 

continue...