今天我们学习python中的字典,这里的字典跟我们传统意义上的字典其实是一个意思。传统意义的字典有一个查询界面,这对应的就是py字典中的健(key);每个查询对象有对应的页码解析,这个对应的解析就是py字典中的值(value)。
那么,什么是健什么是值?字典又有什么作用?接下来我们开始学习→
一、定义
字典和集合一样,都是无序可变序列。字典中的元素,两两配对,以键值对形式存储。
"""基本语法"""
{健(key):值(value),健(key):值(value),健(key):值(value),……}
字典中的健必须是不可变类型,比如字符串、数字、元组等,且字典中的健必须具备唯一性,一个字典中不能有两个重复的健存在,重复定义会将旧值覆盖。
字典中的值没有固定限制,可以是任何一种序列类型。
字典有许多生成和创建方式⬇️
| 序号 | 方式 | 作用 | 示例 |
| ① | x={键值对} | 简单粗暴,直接字面量创建 |
x={"a":1,"b":2,"c":3} |
| ② | dict() | 使用dict()函数,给健直接赋值 |
x=dict(a=1,b=2,c=3) |
| ③ | dict(可迭代对象) | 利用列表嵌套元组的方法,生成可迭代对象 |
# 外层:列表(可迭代) |
| ④ | dict.fromkeys() | 快速初始化相同的值 |
x=dict.fromkeys(["a","b","c"],0) |
| ⑤ | x={} | 空字典的生成 |
x={} #生成的x就是空字典 |
二、字典的增删改查
1.增/改(增加/修改元素)
若key存在,则修改value值,若key不存在,则新增一个键值对。
| 序号 | 作用 | 示例 |
| ① | 修改元素 |
x={"a":1,"b":2,"c":3} |
| ② | 新增元素 |
x={"a":1,"b":2,"c":3,} |
2.删(删除元素)
| 序号 | 方法 | 作用 | 示例 |
| ① | del x[key] | 利用del方法,删除固定键值对 |
x={"a":1,"b":2,"c":3} |
| ② | x.pop(key,默认值) | 若不设置默认值,删除后返回value,没有对应的key则报错;若设置默认值,没有对应的key不报错,返回默认值。 |
x={"a":1,"b":2,"c":3} x={"a":1,"b":2,"c":3} |
| ③ | x.popitem() | 删除最后插入的键值对,返回元组(key,value) |
x={"a":1,"b":2,"c":3} |
| ④ | x.clear() | 清空字典中所有的元素,保留字典对象 |
x={"a":1,"b":2,"c":3} |
3.查(查找/获取元素)
| 序号 | 方法 | 作用 | 示例 |
| ① | x[key] | 利用key索引获取相应的值,若key不存在则报错 |
x={"a":1,"b":2,"c":3} print(x["d"]) |
| ② | x.get(key,默认值) | 没有输入默认值时,若key不存在,则报错 |
x={"a":1,"b":2,"c":3} y=x.get("d") |
| 输入默认值时,若key不存在,则输出默认值 |
x={"a":1,"b":2,"c":3} |
三、字典的遍历及其方法
若你学习了前面的集合知识,你应该很容易理解遍历是什么,其实遍历就是获取所有元素。但对于字典来说,遍历并不一定代表获取全部的元素,也可以是获取全部的key,或则获取全部的value,还可以是获取全部的键值对等等
下面是字典获取的三大方法⬇️
| 序号 | 方法 | 作用 | 示例 |
| ① | x.keys() | 获取字典中所有的key |
x={"a":1,"b":2,"c":3} |
| ② | x.values() | 获取字典中所有的value |
x={"a":1,"b":2,"c":3} |
| ③ | x.items() | 获取字典中所有的键值对元组(key,value) |
x={"a":1,"b":2,"c":3} |
这些方法可以获取相关元素,并存储起来。但如果需要字典遍历(一个一个的获取元素),我们可以通过以上方法与for循环结合获取。
| 序号 | 作用 | 示例 |
| ① | 利用for循环,遍历key |
x={"a":1,"b":2,"c":3} |
| ② | 利用for循环,遍历key和value |
x={"a":1,"b":2,"c":3} |
| ③ | 利用for循环,直接遍历字典,系统默认遍历key |
x={"a":1,"b":2,"c":3} |
四、字典常用内置函数
以下内置方法主要是合并字典
| 序号 | 方法 | 作用 | 示例 |
| ① | x.updat(y) | 合并两个字典,并汇总给x |
x={"a":1,"b":2} |
| ② | z=x|y | 合并两个字典,生成一个新字典,不改变原字典 |
x={"a":1,"b":2} |
| ③ | x|=y | 原地合并两个字典 |
x={"a":1,"b":2} |
五、判断健是否存在
在字典中我们可以利用in/not in的方法,判断key是否存在该字典中。
x={"a":1,"b":2,"c":3}
print("a" in x)
#True
print("d" in x)
#False
但要注意的是,in/not in的方法并不能判断字典中的值(value)
x={"a":1,"b":2,"c":3}
print(1 in x)
#False,不论值是否存在于字典中,都会输出False
当我们要用in/not in方法判断值,应该这样写
x={"a":1,"b":2,"c":3}
print(1 in x.values())
#True
六、字典推导式
之前我们学习的列表推导式和集合推导式,现在的字典推导式也和那两个差不多,只不过表达式现在需要两个,一个key表达式,一个value表达式。
1.基本推导式
{key表达式: value表达式 for 变量 in 可迭代对象}
前面部分由两个表达式生成结果,后面的循环依次输出范围内数据,举个例子
x={i:i*2 for i in range(5)}
print(x)
#{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
2.带分支结构推导式
{key表达式: value表达式 for 变量 in 可迭代对象 if 条件}
利用if语句,筛选不需要的部分
x={i:i*2 for i in range(10) if i>5}
print(x)
#{6: 12, 7: 14, 8: 16, 9: 18}
跟其他序列类型相同的,字典推导式主要作用也是更快的生成字典,而不是使用传统的for循环生成。字典推导式当然也可以用嵌套的形式来写,并且有多个分支结构搭配,读者们可以根据自己的需求自由搭配。
但是需要注意的是,推导式是一种简洁的操作形式,不要为了更高级的形式就刻意地使用它,因为py讲究的是通俗易懂的形式~
七、字典的拷贝问题
拷贝与赋值不同的是,拷贝是生成两个不同地址的字典,而赋值是生成两个地址相同的字典。
若地址相同,则只要有一个字典改变,另一个就会跟着改变。同理,地址不同的字典不会受另一个的改变而改变。
1.浅拷贝
拷贝字典浅层内容,浅层地址发生改变,深层地址不变。
x = {"a": [1,2]}
y = x.copy()
x["a"].append(3)
print(y)
#{"a":[1,2,3]}
以上例子体现我们给x浅拷贝,生成y字典,并将x深层内容改变,y也会随之改变,这就体现x和y实际上深层地址是同一个。
2.深拷贝
利用copy模块的deepcopy方法,可以给字典进行深拷贝,这样字典的浅层和嵌套层地址都会发生改变。
import copy
x={"a":[1,2],"b":[3,4]}
y=copy.deepcopy(x)
x["a"].append(5)
print(x)
print(y)
#{'a': [1, 2, 5], 'b': [3, 4]}
#{'a': [1, 2], 'b': [3, 4]}
显然,这样x和y就不会相等。
八、总结
利用字典收集大量内容,可以让我们快速获取所需的值,不用一个一个去查找。
下面是我通过morse密码,获取对应的字母,输出“加密“语句对应的英文。
morse = {
'a': '.-', 'b': '-…', 'c': '-.-.', 'd': '-..', 'e': '.',
'f': '..-.', 'g': '–.', 'h': '….', 'i': '..', 'j': '.—',
'k': '-.-', 'l': '.-..', 'm': '–', 'n': '-.', 'o': '—',
'p': '.–.', 'q': '–.-', 'r': '.-.', 's': '…', 't': '-',
'u': '..-', 'v': '…-', 'w': '.–', 'x': '-..-', 'y': '-.–', 'z': '–..'
}
reverse_morse = {v: k for k, v in morse.items()}
morse_str = "…. . .-.. .-.. —"
code_list = morse_str.split()
res = ""
for code in code_list:
res += reverse_morse[code]
print(res)
#hello
怎么样,是不是比肉眼一个个对应方便很多呢?
多多动动你的小手操作一下,也许你也能够轻松地写一个强大的字典~
最后,感谢大家的阅读,如果你对py的其他知识感兴趣,可以看看我的其他博客,那里有清晰的讲解。如果本篇文章有什么不足和漏洞,希望大家可以指出,我将立即做出改正!!
网硕互联帮助中心






评论前必须登录!
注册