第六天 - 字典

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...

猜你喜欢

转载自www.cnblogs.com/xi1419/p/9838586.html