今天更新字典的基础知识,作为笔记供复习使用,还是代码+注释的形式,在注释方面,我尽量做到更加详细,能够作为每个知识点的引言,让每个知识点的出现不是突然的,而是有缘由的,如有不足,希望讨论补充~
'''
怎么创建一个字典?考虑下面的基础方法:
'''
x = {"吕布":"口口布", "关羽":"关习习"}
#* 通过大括号,元素:元素,的方式建立一个字典
#* 冒号左边是键,冒号右边是值,因此冒号,冒号左右的内容统称为一个键值对,
#* 键和值是一一映射关系
#* 我们可以通过type函数查看字典类型
print(type(x))
#?那么如何找到字典中指定键的值呢?可以通过方括号加键的方式索引之
print(x["关羽"],x["吕布"])
#* 可以通过方括号索引进行值的修改,当然,如果指定的键在字典中不存在,
#* 那么将会在字典中插入这个新的键值对
x["刘备"] = "刘又田"
print(x)
#TODO 下面是六种创建字典的方式
#TODO 大括号冒号类
a = {"吕布":"口口布", "关羽":"关习习"}
#TODO 用dict函数创建一个字典,参数分别指定键与值,用等号配对
b = dict(吕布="口口布", 关羽="关习习", 刘备="刘又田")
#TODO dict参数是一个列表,列表内的键值对以元组的方式表示,逗号配对键与值
c = dict([("吕布", "口口布"), ("关羽", "关习习"), ("刘备", "刘又田")])
#TODO 用将第一种方法作为dict函数的参数,有点鸡肋
d = dict({"吕布":"口口布", "关羽":"关习习"})
#TODO 在dict函数内也可以混合使用多种方法,如同时使用大括号冒号类与等号配对类
e = dict({"吕布":"口口布", "关羽":"关习习"}, 刘备="刘又田")
#TODO 用zip函数作为dict函数的参数,zip的参数是两个列表,第一个列表是键的内容,第二个列表是值
f = dict(zip(["吕布", "关羽", "刘备"], ["口口布", "关习习", "刘又田"]))
#* 我们发现这六种方法等价
print(a == b == c == e == d == f)
#TODO 可以使用dict.fromkeys()方法初始化,fromkeys接收两个参数,
#TODO 第一个参数是一个可迭代对象,比如字符串,列表,元组,可迭代对象的每一个元素作为字典的键
#TODO 第二个参数是初始化的值,将字典中的键都赋以相同的指定的值
d = dict.fromkeys("Study", 250)
print(d)
#*前面说了,可以修改字典中的值
d['S'] = 70
print(d)
d['u'] = 67
print(d)
#TODO 可以用.pop()方法进行字典指定键值对的删除,.pop()返回指定键的值,
#TODO 如下面的打印,将pop方法返回的那个删除键的值打印出来
print(d.pop('d'))
d.pop('S')
print(d)
#! d.pop("狗")是不被允许的,这会抛出异常,那么如果不想抛出异常,可以设置default的值
#! 比如:d.pop("狗", "没有")
#* 在python3.7之前,字典是无序的,因此popitem()方法将字典中随机的键值对删除
#* 但是python3.7之后,字典是有序的,因此popitem()方法默认将字典中最后一次输入的
#* 键值对删除,下面来演示这个方法
d.popitem()
print(d)
#TODO 回顾一下,del关键字可以将指定内容删除,它同样可以删除指定键值对,甚至是字典
d = dict.fromkeys("Study", 250)
del d['y']
print(d)
del d
#! 这时,如果print(d)则会抛出异常,因为此时d字典已经被清除,
#! 如果只想清除字典中的全部元素,可以考虑下面的方法
d = dict.fromkeys("Study", 250)
d.clear()
print(d)
d = dict.fromkeys("Study")
print(d)
d['S'] = 115
print(d)
d.update({'t':105, 'u':104})
d.update(d='70', y='67')
print(d)
#TODO 如果想要修改键的值,可以考虑索引方法和update函数
#TODO 想要查找键中的值,可以直接索引寻找
d = dict.fromkeys("I love Sudy")
d["S"] = 250
print(d["S"])
#* 但是当没有该键时,会报异常,可以考虑get函数,它的第一个参数是寻找的键,
#* 第二个参数是找不到该键时返回的字符串,参照下面的使用例子
print(d.get("t", "这里没有t"))
#TODO 如果想在字典中找指定的键,而找到则返回键对应的值,找不到则新建该键,
#TODO 然后把第二个参数default的值作为新键的值,同时返回该新建值,参考下面的使用例子
d.setdefault("t", "220")
print(d["t"])
print(d.setdefault("M", "9"))
#TODO 我们可以设置眼睛,来监视字典中的情况,这就是视图对象
#TODO items方法可以返回字典中的键值对的视图对象,keys方法可以返回字典中的键的视图对象
#TODO values方法可以返回字典中值的视图对象,参考下面的使用例子
keys = d.keys()
values = d.values()
items = d.items()
print(items, keys, values)
#* 字典也可以浅拷贝,可以使用copy函数
e = d.copy()
print(e)
#? 有时候我们想知道这本字典有多少个单词,那么可以考虑使用len函数,
#* len函数返回字典中键值对的个数,考虑下面的使用例子
print(len(d))
#? 我们想要知道某个键值对是不是在字典中,就像我们想要知道某个单词和他的注释是否在字典中一样
#* 我们可以考虑使用in 和not in 关键字,in 和 not in 关键字判断键是否在字典中,
#* 在则返回True, 不在则返回False,当然,如果键都不在字典中了,值当然也就不存在了
#* 键和值是同步捆绑的,考虑下面的使用例子
print("u" in d)
print("Q" not in d)
print("t" not in d)
#? 通常我们想抽出字典中所有的键,或者抽取出字典中所有的值,我们怎么做?
#? list函数将迭代器转化为列表,如果将list函数作用于字典会怎么样?
#* list(d)相当于list(d.keys()),它将字典中的键形成一个列表,
#* 当然,如果想把值抽取出来形成一个列表,可以考虑list(d.values())
#* 考虑下面的使用例子
print(list(d.keys()))
print(list(d))
print(list(d.values()))
#? 如果我们想一个个抽取出字典中的键呢?
#* 回顾一下iter函数,它将得到序列的迭代器,它也可以作用于字典,
#* iter函数作用于字典,将得到字典所有键的迭代器,
#* 然后就可以用next函数抽取迭代器中的一个个键了,考虑下面的使用例子
e = iter(d)
print(next(e))
print(next(e))
print(next(e))
print(next(e))
#* 之前我们提到,字典在python3.7之前是无序的,但是现在我们的字典是有序的了,
#* 既然字典有序,那么我们就可以使用sorted和reversed函数对其进行排序
d = dict.fromkeys("I love Study", 260)
d["S"] = 110
d["I"] = 90
d[" "] = 20
d["o"] = 1000
print(list(reversed(d.values())))
print(sorted(d.values()))
print(sorted(d.values(), reverse=True))
#* 字典的值可以嵌套的,可以嵌套字典,可以嵌套序列
d = {"吕布":{"语文":60, "数学":70, "英语":90}, "关羽":{"语文":80, "数学":90, "英语":70}}
print(d) #TODO print字典名,则打印整个字典,无论嵌套,这没什么问题
print(d["吕布"]["数学"]) #TODO 当字典是嵌套字典时,索引字典中的值通常是:字典.[键][键]的形式
d = {"吕布":[60, 70, 80], "关羽":[80, 90, 70]} #* 值可以是列表,也可以是字符串,元组
print(d["吕布"][1]) #* 这时候的索引,通常是:字典.[键][下标]的形式
print(d["关羽"][2])
希望我的笔记可以帮助到你,祝你学习快乐~