05 字典

本节主要内容:

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])

 

posted @ 2018-10-23 21:33  zero_zero_zero  阅读(114)  评论(0编辑  收藏  举报