本节主要内容:
1.字典的简单介绍
2.字典增删改查和其他操作
3.字典的嵌套
一.字典的简单介绍
字典(dict)是python中唯一的一个映射类型.他是以{}括起来的键值对组成.在dict中key是唯一的.在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法.所以,切记,在dict中存储的key-value中的key必须是可hash的,如果搞不懂什么是可哈希,暂时可这样记,可改变的都是不可哈希的,可哈希意味着不可变,这个是为了能准确的计算内存地址而规定的.
已知的可哈希(不可变)的数据类型:int, str, tuple, bool
不可哈希(可变)的数据类型:list, dict, set
语法:
{key1:value1, key2:value2...}
注意:key 必须是不可变的(可哈希的), value没有要求,可以保存任意类型的数据
# 合法 dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅 哥', '美⼥女女'], (1, 2, 3): '麻花藤'} print(dic[123]) print(dic[True]) print(dic['id']) print(dic['stu']) print(dic[(1, 2, 3)]) # 不不合法 # dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不不能作为key # dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不不能作为key dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不不能作为key
dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash表的顺序保存的,而hash表不是连续的,所以不能进行切片工作,他只能通过key来获取dict中的数据
二.字典的增删改查和其他相关操作
1.增加
dic = {} dic["王者荣耀"] = "男生都爱玩" # 添加dic[字典中不存在的Key] = value dic["刺激战场"] = "吃鸡战场" dic["王者荣耀"] = "什么鬼" # key如果重复了,会修改覆盖原来的值, # 流程:1.先判断key是否存在,如果存在,就不执行新增,如果不存在,执行新增 dic.setdefault("宫本武藏", "很牛") dic.setdefault("宫本武藏", "我的宫本很菜") # 如果key存在了就不会再添加了 dic.setdefault("李白") # None dic.setdefault("李白","坑") # None print(dic)
2.删除
dict字典3.5以下的解释器时无序的 dic = {"张无忌":"倚天屠龙记", "紫薇":"还珠格格", "王语嫣":"天龙八部","刘能":"乡村爱情协奏曲"} dic.pop("刘能") # 指定某个key进行删除 dic.pop("王语嫣") dic.popitem() # 看起来是删除最后一个,实际上是随即删除的,因为是随机,因为底层是随机,无序的 dic.popitem() del dic["紫薇"] # 清空字典中的所有内容 dic.clear() print(dic)
3.改
dic = {"张无忌":"倚天屠龙记", "紫薇":"还珠格格", "王语嫣":"天龙八部", "刘能":"乡村爱情协奏曲"} # dic["王语嫣"] = "天龙九部" # dic[已经存在的key] = 新value dic2 = {"张无忌": "魔教教主", "紫薇":"还珠格格第二部", "马大帅":"彪哥"} dic.update(dic2) # 把dic2中的内容覆盖到dic中 print(dic)
4.查
dic = {"张无忌":"倚天屠龙记", "紫薇":"还珠格格", "王语嫣":"天龙八部", "刘能":"乡村爱情协奏曲"} # print(dic["小燕子"]) # KeyError: '小燕子',如果key不存在,报错,keyerror print(dic.get("小燕子")) # None 当key不存在的时候不会报错,默认返回None print(dic.get("晴儿", "没有")) # 两个参数,如果第一个参数不存在.返回第二个操作作为默认值,如果存在直接返回value # setdefault # 流程 : # 1.先判断key是否存在,如果存在,就不执行新增,如果不存在,执行新增 # 2.根据你给的key把value查询出来 # setdefault() 新增 dic = {"jay":"周杰伦"} ret = dic.setdefault("jay","林俊杰") print(dic) # {'jay': '周杰伦'} print(dic, ret) # {'jay': '周杰伦'} 周杰伦
dic = {"张无忌":"倚天屠龙记", "紫薇":"还珠格格", "王语嫣":"天龙八部", "刘能":"乡村爱情协奏曲"} # print(dic["小燕子"]) # KeyError: '小燕子',如果key不存在,报错,keyerror print(dic.get("小燕子")) # None 当key不存在的时候不会报错,默认返回None print(dic.get("晴儿", "没有")) # 两个参数,如果第一个参数不存在.返回第二个操作作为默认值,如果存在直接返回value # setdefault # 流程 : # 1.先判断key是否存在,如果存在,就不执行新增,如果不存在,执行新增 # 2.根据你给的key把value查询出来 # setdefault() 新增 dic = {"jay":"周杰伦"} ret = dic.setdefault("jay","林俊杰") print(dic) # {'jay': '周杰伦'} print(dic, ret) # {'jay': '周杰伦'} 周杰伦
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99] dic = {"key1":[], "key2":[]} for i in lst: if i > 66: dic["key1"].append(i) else: dic["key2"].append(i) print(dic) dic = {} for i in lst: if i > 66: dic.setdefault("key1", []).append(i) else: dic.setdefault("key2", []).append(i) print(dic)
5. 其他相关操作
dic = {"意大利":"西西里的美丽传说", "意大利2":"天堂电影院", "美国":"美国往事","美国电视剧":"越狱"} print(dic.keys()) # 返回的内容想列表,但是不是列表 # dict_keys(['意大利', '意大利2', '美国', '美国电视剧']) for k in dic.keys(): # 可以迭代,拿到的是每一个key print(k) for k in dic: # 如果就是k in dic,取得的结果跟 k in dic.keys()是一样的, print(k) # 意大利 # 意大利2 # 美国 # 美国电视剧 print(dic.values()) # dict_values(['西西里的美丽传说', '天堂电影院', '美国往事', '越狱']) for v in dic.values(): print(v) print(dic.items()) # 返回键值对(key, value) # dict_items([('意大利', '西西里的美丽传说'), ('意大利2', '天堂电影院'), ('美国', '美国往事'), ('美国电视剧', '越狱')]) # 遍历字典的最好的方案 for k,v in dic.items(): # item 是元组(key, value) print(k, v) # 意大利 西西里的美丽传说 # 意大利2 天堂电影院 # 美国 美国往事 # 美国电视剧 越狱 # 元组可以进行解包 # a, b, c = (1, 2, 3) # 解构, 解包 # print(a,b)
a, b, c = (1, 2, ) # 解构, 解包 解构的时候注意数量量必须匹配
ValueError: not enough values to unpack (expected 3, got 2)
# 真正的字典的迭代 # 直接循环字典拿到的是key for k in dic: print(k) print(dic[k])