字典的常用操作

>大纲

  • dict的介绍
  • dict的语法
  • dict的增删改查
  • dict的操作功能
  • dict的for循环
  • dict的嵌套
  • 解包,解构

1.dict(字典)简介

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

# ====================

2.字典的语法

# {key1: value1, key2: value2....}
# dic = {"章子怡":"汪峰的老婆"}
# print(dic)
# # {'章子怡': '汪峰的老婆'}

# ====================

3.增加

# # 方法一
# dic ["baby"] = "黄晓明的老婆"
# print(dic)
# # {'章子怡': '汪峰的老婆', 'baby': '黄晓明的老婆'}
# # 方法二
# # 方法二
# dic.setdefault("马蓉","王宝强的前妻")
# print(dic)
# # {'章子怡': '汪峰的老婆', 'baby': '黄晓明的老婆', '马蓉': '王宝强的前妻'}
# # 特殊情况一
# # 当添加的键已经存在字典中
# dic ["baby"] = "漂亮"
# print(dic)
# # {'章子怡': '汪峰的老婆', 'baby': '漂亮', '马蓉': '王宝强的前妻'}    当key已经存在时,会吧以前的value替    
# # 换成新value
# # 特殊情况二
# dic.setdefault("马蓉","张集的情人")
# print(dic)
# # {'章子怡': '汪峰的老婆', 'baby': '漂亮', '马蓉': '王宝强的前妻'}    当key已经存在时,不会再添加.
# # 特殊情况三

# dic ["name"] = ""
# print(dic)
# # {'章子怡': '汪峰的老婆', 'baby': '漂亮', '马蓉': '王宝强的前妻', 'name': ''}    当value为空时,增加的也是# # 空
#
#
# dic.setdefault("age","")
# print(dic)
# # {'章子怡': '汪峰的老婆', 'baby': '漂亮', '马蓉': '王宝强的前妻', 'name': '', 'age': ''}     当value为空 
# #  时,增加的也是空

4.删除

 # 方法一

# name_dict = {"name":"王剑威","age":"22","add":"HeBei"}
# name_dict.pop("add")
# print(name_dict)

# {'name': '王剑威', 'age': '22'}
# ret = name_dict.pop("add")
# print(ret)
# HeBei     pop删除的内容可以被变量接受,但是只会返回value.
# 方法二
# del name_dict["age"]
# print(name_dict)
# {'name': '王剑威', 'add': 'HeBei'}
# 方法三
# 随机删除
# name_dict.popitem()
# print(name_dict)
# {'name': '王剑威', 'age': '22'}

# ret = name_dict.popitem()
# print(ret)
# ('add', 'HeBei')  返回的key和value,并添加到元祖中

5.修改

# 方法一
# name_dict = {"name":"王剑威","age":"22","add":"HeBei"}
# name_dict["age"] = 30
# print(name_dict)
# {'name': '王剑威', 'age': 30, 'add': 'HeBei'}
# 方法二 (此方法作为了解)
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# dic2 = {"华三":"于英涛","阿里巴巴":"王剑威","华为":"everyone"}
# dic1.update(dic2)
# print(dic1)
# # {'阿里巴巴': '王剑威', '京东': '刘强东', '腾讯': '马化腾', '华三': '于英涛', '华为': 'everyone'}
# print(dic2)
# # {'华三': '于英涛', '阿里巴巴': '王剑威', '华为': 'everyone'}
#
# # 从以上可以看看出是将dic2更新到了dic1中,但是再两个字典中存在重复的key,结果是将dic2的相同key的# # # value更新到了dic1

6.查

# # 方法一
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# print(dic1.get("阿里巴巴"))
# # 马云
#
# # 当查找的key为空时,返回None
# print(dic1.get(""))
# # None
# # 方法二  setdefault除了可以添加还可以通过key查找value,但是需要变量接受,或者直接print
# # 方法二  setdefault除了可以添加还可以通过key查找value,但是需要变量接受,或者直接print
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# print(dic1.setdefault("腾讯"))
# # 马化腾
# setdefault功能完全讲解,除了增加,还能查找
# # 下面这个例子,可以看出setdefault有两步,一是添加,当添加的这个key在dict中不存在时,会添加这个键值# # #  对,如果key存在时不添加
# # 二然后根据添加的key去返回对应的value
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# ret = dic1.setdefault("苏宁","ABC")
# print(ret)
# # ABC

7.dict的常见方法

# .keys()   返回字典中所有的key
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# print(dic1.keys())
# #dict_keys(['阿里巴巴', '京东', '腾讯'])    返回所有的key,但是输出到了一个类似列表的一个列表中,可以for循环
# .values()     返回字典中所有的value
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# print(dic1.values())
# # dict_values(['马云', '刘强东', '马化腾'])     返回所有的value,但是输出到了一个类似列表的一个列表中,可以for循环
# # .items()    返回所有的键值对
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# print(dic1.items())     # 返回所有的键值对
# # dict_items([('阿里巴巴', '马云'), ('京东', '刘强东'), ('腾讯', '马化腾')])
# #  将返回的所有的键值放进一个列表,每一个键值对又被放进列表中的一个元组中,同样可以使用for

8.字典的for循环

# 字典本身就是一个可迭代的数据类型,所以可以进行for循环
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# for n in dic1:
#     print(n)
    # 阿里巴巴
    # 京东
    # 腾讯
# 但是默认参加循环的时字典的key,所以会打印dic1的所有key
#那么如何将字典的value通过for循环遍历呢,方法有很多.....
# 方法一
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# for n in dic1.values(): #.values()取到的就是字典的每一个value,所以直接遍历的就是value
#     print(n)
    # 马云
    # 刘强东
    # 马化腾
# 方法二
# dic1 = {"阿里巴巴":"马云","京东":"刘强东","腾讯":"马化腾"}
# for n in dic1:      #这里循环的是字典本身,但是前面学过如何单个的取出key对应的value,那就是下面的代码
#     print(dic1[n])      #用字典加上key,输出的就是value,方法很多...
#     print(dic1.get(n))
#     print(dic1.setdefault(n))
    # 马云
    # 马云
    # 马云
    # 刘强东
    # 刘强东
    # 刘强东
    # 马化腾
    # 马化腾
    # 马化腾

  

# ====================

9.字典的嵌套

# 现有如下字典
superstart = {"name":"汪峰",
              "age":44,
              "wife":{"name":"章子怡",
                      "age":37,
                      "gongzi":{"一月":90000,
                                "二月":120000,
                                "三月":110000,
                                "四月":160000}},
              "chair":[{"name":"老大",
                        "age":8,
                        "gender":"男"},
                       {"name":"老二",
                        "age":10,
                        "gender":"女"}]}

  问题一:

# 现在要求输出汪峰的第二个孩子是男孩还是女孩.
# print(superstart.get("chair")[1]["gender"])

  问题二:

# 输出汪峰老婆三月挣了多少钱?
# print(superstart["wife"]["gongzi"]["三月"])

10.今天新学一个解构, 记在这里

# 定义两个变量,两个值
# a = 1
# b = 2
# print(a,b)
# 结果:1 2
# 解包之后
# a,b = (1,2)
# print(a,b)
# 结果:1 2