5.字典

字典

字典的介绍

字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是 唯一的. 在保存的时候, 根据key来计算出一个内存地址. 然后将key-value保存在这个地址中. 这种算法被称为hash算法, 所以, 切记, 在dict中存储的key-value中的key'必须是可hash的, 如果你搞不懂什么是可哈希, 暂时可以这样记, 可以改变的都是不可哈希的, 那么可哈希就意味着不可变. 这个是为了能准确的计算内存地址而规定的.

字典是以{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['stu'])
print(dic[(1,2,3)])
#不合法
dic = {[1,2,3]:'周杰伦'} #list是可变的
dic = {{1:2}:'哈哈'} #dict是可变的
dic = {{1,2,3}:'呵呵呵'} #set是可变的 

dict保存的数据不是按照我们添加进去的顺序保存的. 是按照hash表的顺序保存的. 而hash表 不是连续的. 所以不能进行切片工作. 它只能通过key来获取dict中的数据 .

字典的增删改查(重点)

1. 添加

dic[新key] = 值

setdefault()

dic = {"意大利":"李云龙","美国":"美国往事"}
dic["日本"] ="东京热" #新key表示添加
dic["意大利"] = "小白" #替换
#流程:判断给你的key是否存在字典中,如果存在就不在操作
dic.setdefault("美国","三傻大佬宝莱坞")
print(dic)#{'意大利': '小白', '美国': '美国往事', '日本': '东京热'}  

2. 删除

pop(key)

dic = {"张艺谋":"红高粱","李安":"断臂山","陈凯歌":"霸王别姬","郭德纲":"祖宗十九代"}
dic.pop("郭德纲")
dic.popitem() #随机删
del dic["张艺谋"]
print(dic)#{'李安': '断臂山'}
dic.clear()
print(dic)#{}

3. 修改

dic[老key] = 值
update() 跟新字典

dic = {"河南":"胡辣汤", "开封": "灌汤包", "武汉":"热干面"}
dic['河南'] = "烩面" # 老key = 值
print(dic)#{'河南': '烩面', '开封': '灌汤包', '武汉': '热干面'}

dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"}
dic2 = {"赵四":"宝宝", "刘能":"萌萌", "皮校长":"皮长山"}
dic1.update(dic2) # 把dic2怼到dic1里面. 把dict2中的内容更新到dic1
print(dic1)#{'赵四': '宝宝', '刘能': '萌萌', '王木生': '范伟', '皮校长': '皮长山'}
print(dic2)#{'赵四': '宝宝', '刘能': '萌萌', '皮校长': '皮长山'}

4. 查询

dic[key]
get(key, 值)
setdefault(key, value)

查询一般用key来查找具体的数据.

dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"}

#1. 直接使用key就可以拿到value
print(dic1["赵四四"]) # KeyError: '赵四四' key不存在

#2. get(key)
print(dic1.get("刘能能")) # None 当key不存在返回None
print(dic1.get("刘能能", "没有这个人")) # 当key不存在. 返回第二个参数. 默认第二个参数是None

#3. setdefault() 第一个功能是添加(当key不存在). 第二个功能是查询(根据你给的key查询)
#整个执行流程: 判断给的key是否存在. 如果存在. 就不执行新增流程.直接查询出这个key对应的value
#如果key不存在. 先执行新增操作. 再使用key把对应的value查询出来
ret = dic1.setdefault("皮长山", "皮校长")
print(ret) # 皮校长

ret = dic1.setdefault("王木生", "宝宝")
print(ret) # 范伟

遍历,字典是一个可迭代对象

# 遍历字典两套方案
dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"}
#1. 使用for循环直接遍历字典的key
for key in dic:
print(key)
print(dic[key])

#2. 可以使用字典的items()+解构可以直接获取到key和value
for k, v in dic.items():
print(k)
print(v) 

字典的相关操作
1. keys() 获取到所有的键
2. values() 获取到所有的值
3. items() 拿到所有的键值对

dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"}
#不常用的
print(dic.keys()) # dict_keys(['赵四', '刘能', '王木生']) 像列表. 山寨列表
for k in dic.keys(): # 拿到的是字典中的每一个key
print(k)
#当需要单独获取到所有value的时候
print(dic.values()) # dict_values(['刘晓光', '王晓利', '范伟']) 所有的value的一个数据集
for v in dic.values():
print(v)
print(dic.items()) # 所有的键值对 dict_items([('赵四', '刘晓光'), ('刘能', '王晓利'), ('王木生', '范伟')])
for k, v in dic.items(): # 遍历字典最简单的方案
# print(item) # ('赵四', '刘晓光')
# k, v = item # 解构
# k = item[0]
# v = item[1]
print(k, v)

4. 字典的嵌套
字典的嵌套. 字典套字典

wf = {
"name":"汪峰",
"age":52,
"hobby":["唱歌", "上头条", "穿皮裤"],
"wife": {
"name": "章子怡",
"age": 49,
"hobby":["演戏", "上电视", "当导师"],
"tishen": {
"name":"萌萌",
"age":28
},
"zhuli":{
"name":"磊磊",
"age": 20
}
},
"zhuli":{
"name":"宝宝",
"age":23,
"hobby":["抽烟","喝酒","烫头"]
},
"children":[{"name":"汪老大"}, {"name":"汪老二"}]
}
wf['children'][1]["age"] = 2
print(wf)
# print(wf['zhuli']['name'])

# 汪峰老婆替身的名字
print(wf['wife']['tishen']['name'])
# 汪峰老婆的第二个爱好
print(wf['wife']['hobby'][1])
# 汪峰助理的第三个爱好
print(wf['zhuli']['hobby'][2])

# 汪峰的助理+10岁
wf['zhuli']['age'] = wf['zhuli']['age'] + 10
# 汪峰的老婆添加一个爱好("导戏")
wf['wife']['hobby'].append("导戏") # 添加完毕了
# 删除汪峰助理的"抽烟"爱好
wf["zhuli"]["hobby"].remove("抽烟")
print(wf)

5. 集合(不重要). 去重复

# 唯一能用到的点. 去重复
lst = ["麻将", "牌九", "骰子", "扑克", "骰子", "扑克", "扑克", "扑克"]
# 把列表转化成集合 x 转化成y类型 y()
s = set(lst)
print(s)

集合中的元素是不重复的. 必须是可哈希的(不可变), 字典中的key
空集合:set()
空元组:tuple()
空列表:list()
非空集合: {123}集合, 集合其实就是不存value的字典

s = {"刘嘉玲", "赵本山", "莱昂纳多迪卡普里奥", "罗纳尔多"}
# 把罗纳尔多修改成梅西
s.remove("罗纳尔多") #移除
s.add("梅西") #添加
print(s)

交集,并集,差集,反交集

s1 = {"门神", "灯神", "灯神你在笑什么?"}
s2 = {"门神", "灯神", "你俩在干什么?"}

# 交集
print(s1 & s2)
print(s1.intersection(s2))

# 并集
print(s1 | s2)
print(s1.union(s2))

# 差集
print(s1 - s2) # s1中特有的内容
print(s1.difference(s2))

# 反交集
print(s1 ^ s2) # 两个集合中特有的内容
print(s1.symmetric_difference(s2))
如果非要集合套集合

s = frozenset({"哈哈","呵呵"}) # 不可变的数据类型(集合)
for el in s:
print(el) 

练习题

dic1 = { 'name':['alex',2,3,5],
'job':'teacher',
'oldboy':{'alex':['python1','python2',100]}
}
1,将name对应的列表追加一个元素’wusir’。
2,将name对应的列表中的alex首字母大写。
3,oldboy对应的字典加一个键值对’老男孩’,’linux’。
4,将oldboy对应的字典中的alex对应的列表中的python2删除。

dic1['name'].append('wusir')
dic1['name'][0]= dic1['name'][0].capitalize()
dic1['oldboy']["老男孩"] = 'linux'
dic1['oldboy']['alex'].remove('python2')
print(dic1)
一. 昨日内容回顾
    1. list列表
        写法:[元素, 元素]
        对元素的数据类型没有要求
        也有索引和切片
        索引从0开始
        切片
        lst[start: end: step]
            从start到end. 每隔step取一个

        增删改查
            1. 增加:
                1. append() 追加. 在列表的末尾添加
                2. insert(index, 元素) 在index位置插入元素

            2. 删除:
                1. pop(i) 默认从末尾删除, 还可以指定位置删除
                2. remove(元素) 删除指定元素
            3. 修改:
                通过索引去修改元素
                lst[3] = "胡辣汤"
            4. 查询:
                for item in lst: # 拿不到索引
                    print(item)

        range(m) 从0到m
        range(m, n) 从m到n
        range(m, n, p) 从m到n. 每P个取一个

        for i in range(len(lst)):
            i  索引
            lst[i] 元素

        元组: 不可变的. 只读列表. 有索引. 有下标, 有切片.
            不可变: 内部指向

        可变的: list
        不可变的:str, int, bool, tuple

二. 作业讲解
三. 今日主要内容
    1. 什么是字典
        字典是以key:value的形式来保存数据
        用{}表示. 存储的是key:value
    2. 字典的增删改查(重点)
        1. 添加
            dic[新key] = 值

            setdefault()
        2. 删除
            pop(key)

        3. 修改
            dic[老key] = 值
            update() 跟新字典
        4. 查询
            dic[key]
            get(key, 值)
            setdefault(key, value)
        5. 遍历,字典是一个可迭代对象

    3. 字典的相关操作
        1. keys() 获取到所有的键
        2. values() 获取到所有的值
        3. items() 拿到所有的键值对
    4. 字典的嵌套
        字典的嵌套. 字典套字典

    5. 集合(不重要). 去重复
        集合中的元素是不重复的. 必须是可哈希的(不可变), 字典中的key
        空集合:set()
        空元组:tuple()
        空列表:list()
        非空集合: {123}集合, 集合其实就是不存value的字典

    预习:
        深浅拷贝
        小数据池

        文件操作(带来的作业)

        函数


    # 关于set集合作业: 写一个彩票开奖(36选7)
    from random import randint
    randint(1,36)
大概内容

 

作业

5.字典作业 

posted @ 2019-02-24 14:20  等待の喵  阅读(366)  评论(0编辑  收藏  举报