各位亦菲彦祖,你们好呀!在前面的学习中,我们已经系统地了解了 Python 中的 List(列表) 和 Tuple(元组),它们都是用来存储数据的容器,但各自有着“可变”或“不可变”的特点。今天,让我们继续前行,一口气把另两位“容器大将”—— Dict(字典) 和 Set(集合) 请出来,让他们在我们的编程世界闪耀光芒!
一、Dict(字典)
1. 什么是字典?
字典(Dictionary) 是 Python 中非常强大的数据容器,它以 键(Key)-值(Value) 对的形式来存储数据。可以把它想象成一个“通讯录”或“词典”——我们通过“名字(键)”来快速找到对应的“电话号(值)”或“解释(值)”。
- 键:必须是不可变类型(字符串、数字、元组等),且同一个字典中,键不能重复。
- 值:可以是任意类型的数据,可以相同也可以不同,毫无限制。
2. 字典的创建方式
- 大括号(花括号):
person = { "name": "Alice", "age": 18, "city": "Shanghai" }
dict()
函数:# 方式一:使用关键字参数 person_info = dict(name="Bob", age=20, city="Beijing") # 方式二:传入可迭代对象(如列表或元组),每个元素都需要是一个二元组 (key, value) pairs = [("name", "Tom"), ("age", 25), ("city", "Guangzhou")] person_data = dict(pairs)
- 空字典:
empty_dict = {} another_empty = dict()
3. 访问与修改字典中的元素
3.1 通过键访问对应的值
person = {
"name": "Alice",
"age": 18,
"city": "Shanghai"
}
print(person["name"]) # 输出:Alice
如果访问了一个不存在的键,就会触发 KeyError
错误。为了避免这种情况,我们常常用 get()
方法来安全地获取数据:
print(person.get("gender", "未知"))
# 如果不存在 "gender" 键,就返回默认值 "未知"
3.2 为字典添加或修改键-值对
字典是可变的,可以随时添加或更新键-值对:
person["gender"] = "female" # 新增键
person["age"] = 20 # 修改键的值
print(person)
# 结果:
# {"name": "Alice", "age": 20, "city": "Shanghai", "gender": "female"}
4. 字典的常用方法
-
keys()
、values()
、items()
keys()
返回所有的键,类型是“可迭代的”对象。values()
返回所有的值,类型也可迭代。items()
同时返回键和值的二元组。
person = {"name": "Alice", "age": 20, "city": "Shanghai"} print(person.keys()) # dict_keys(["name", "age", "city"]) print(person.values()) # dict_values(["Alice", 20, "Shanghai"]) print(person.items()) # dict_items([("name", "Alice"), ("age", 20), ("city", "Shanghai")])
-
update(dict_or_iterable)
用另一个字典或可迭代对象来更新当前字典(如果键已存在,则覆盖原来的值;如果键不存在,则新增)。extra_info = {"hobby": "coding", "age": 21} person.update(extra_info) print(person) # 输出:{"name": "Alice", "age": 21, "city": "Shanghai", "hobby": "coding"}
-
pop(key[, default])
删除并返回指定键的值。若指定键不存在且未提供默认值,会报错;如果提供了默认值,则返回默认值。age_value = person.pop("age") print(age_value) # 输出:21
-
popitem()
删除并返回字典中的最后一个“键-值对”。它在 Python 3.7+ 之后按 插入顺序 来操作(也就是说,它弹出的是最新插入的键-值对)。last_item = person.popitem() print(last_item) # 可能输出:("hobby", "coding")
-
setdefault(key[, default])
如果字典中存在key
,则返回对应的值;若不存在key
,则将key
设为default
,并返回default
。gender_value = person.setdefault("gender", "female") print(gender_value) # 输出:female print(person["gender"]) # 现在字典中多出了 "gender" 键
-
clear()
清空字典,变成一个空字典。person.clear() print(person) # 输出:{}
5. 字典的小结
- 字典以
键-值
对的方式存储数据;键不可重复,值可以随意。 - 字典是 可变 的,我们可以对其进行增删改查等操作。
- 由于字典能在 O(1) 的平均时间复杂度内直接访问到指定键对应的值,所以它在需要高效查找的场景中非常常用。
二、Set(集合)
1. 什么是集合?
集合(Set) 是一组 不重复 元素的无序集。就像一个现实中的“独一无二”收集箱,不管你往里放多少相同的东西,它只会保留一个。
- 无序:意味着在集合中没有索引的概念,无法通过下标来获取元素。
- 不重复:同一个元素即使添加多次,在集合中也只会出现一次。
2. 集合的创建方式
- 使用花括号:
my_set = {1, 2, 3, 3, 3} print(my_set) # 输出:{1, 2, 3},重复的元素被自动去掉
- 使用
set()
函数:another_set = set([1, 2, 3, 3, 3]) print(another_set) # 输出:{1, 2, 3} empty_set = set() # 创建一个空集合
{}
用来创建空集合会被识别成空字典,所以要用set()
来创建空集合。
3. 集合的常用操作与方法
-
添加与删除元素
add(x)
:向集合中添加元素x
(如果已存在,集合不变)。fruits = {"apple", "banana"} fruits.add("cherry") print(fruits) # 输出示例:{"apple", "banana", "cherry"}
remove(x)
:从集合中移除元素x
,如果元素不存在会抛出KeyError
。discard(x)
:与remove(x)
类似,但不存在x
时不会报错。pop()
:随机移除并返回一个元素,因为集合是无序的,所以不知道会移除哪一个。clear()
:清空集合所有元素。
-
集合间的运算
Set 提供了一系列集合运算方法,帮助我们快速处理多组数据。- 并集(Union)
set1 | set2
或set1.union(set2)
返回包含两个集合中所有元素的新集合。
- 交集(Intersection)
set1 & set2
或set1.intersection(set2)
返回只包含两个集合共有元素的新集合。
- 差集(Difference)
set1 - set2
或set1.difference(set2)
返回仅包含在set1
中但不在set2
中的元素的新集合。
- 对称差集(Symmetric Difference)
set1 ^ set2
或set1.symmetric_difference(set2)
返回只包含在set1
或set2
中,但不同时属于两者的元素的新集合(去掉交集部分)。
示例:
A = {1, 2, 3, 4} B = {3, 4, 5, 6} print(A | B) # 并集 = {1, 2, 3, 4, 5, 6} print(A & B) # 交集 = {3, 4} print(A - B) # 差集 = {1, 2} print(A ^ B) # 对称差集 = {1, 2, 5, 6}
- 并集(Union)
-
子集与超集
A.issubset(B)
或A <= B
:判断集合 A 是否是集合 B 的子集。A.issuperset(B)
或A >= B
:判断集合 A 是否是集合 B 的超集。
A = {1, 2} B = {1, 2, 3} print(A.issubset(B)) # True print(B.issuperset(A))# True
4. 集合的小结
- 集合中的元素是无序且不重复的,这使其在去重、集合运算(如并集、交集、差集)等方面有极大的优势。
- Python 提供的各种集合方法让我们能够快速地进行运算,极大地提升了效率。
- 由于无序性,集合不能像列表那样通过索引来访问元素,我们只能通过“遍历”或“元素 in 集合”这种方式去操作或判断存在性。
三、Dict 与 Set 的对比
-
相同点:
- 都是 可变 的,可以随意添加、删除内部数据(只要类型允许)。
- 都采用了类似哈希表(Hash Table)的实现,因此在查找和插入方面都具有 O(1) 的平均时间复杂度,非常高效。
-
不同点:
- Dict(字典):存储的是 键-值 对,能通过键来索引某个值;
- Set(集合):只存储元素本身,且不重复、无序、不能使用索引访问。
四、综合示例:字典和集合的应用
下面给亦菲彦祖们举一个例子,通过一个简单的用户注册系统来演示如何同时使用字典和集合。
def user_registration_system():
# 字典用来存储 "用户名" -> "密码" 的映射
# 集合用来存储已经注册过的用户(usernames),方便快速判断某个用户名是否存在
user_dict = {}
user_set = set()
while True:
choice = input("请选择操作:1-注册, 2-登录, q-退出:")
if choice == "q":
print("系统退出,谢谢使用!")
break
elif choice == "1":
username = input("请输入注册用户名:")
if username in user_set:
print("该用户名已被注册,请重新选择用户名。")
else:
password = input("请输入密码:")
# 在字典中记录用户名 -> 密码
user_dict[username] = password
# 在集合中添加用户名
user_set.add(username)
print("注册成功!")
elif choice == "2":
username = input("请输入登录用户名:")
if username not in user_set:
print("用户名不存在,请先注册。")
else:
password = input("请输入密码:")
# 取出字典中对应的密码进行比对
if user_dict[username] == password:
print(f"登录成功,欢迎你,{username}!")
else:
print("密码错误,请重试。")
else:
print("无效选择,请重新输入。")
# 测试
if __name__ == "__main__":
user_registration_system()
- 在这个示例中,
- 字典用来存放用户的账号和密码,能够通过
username
直接获取password
。 - 集合只存放用户名本身,利用集合的“无序且不重复”特性,可以高效地判断某个用户名是否已经被注册。
- 字典用来存放用户的账号和密码,能够通过
- 同时使用两种容器,可以让我们的代码更高效、更简洁。
五、结语
亦菲彦祖们,通过今天的学习,你们已经掌握了 Python 中另外两个非常重要的数据容器—— Dict(字典) 和 Set(集合):
- Dict(字典):能通过 键 快速定位到对应的 值,是进行数据查找、映射和管理的利器。
- Set(集合):由于 无序且不重复 的特点,在去重、集合运算等领域大放异彩。
当你们把字典和集合与之前学习的 List(列表)、Tuple(元组) 组合起来,就能覆盖绝大部分数据存储和处理的场景。在后续的编程中,要经常思考:什么时候适合用字典?什么时候该用集合?如果我需要顺序和可变性,列表又是否更合适? 这样的思考和抉择能让你们在代码层面更好地实现逻辑和效率的平衡。
至此,我们已经把 Python 最主要的容器都串讲了一遍,希望你们能够多练习、多尝试,学以致用。如果在学习或应用中有任何疑问,欢迎在评论区分享,一起交流进步!亦菲彦祖,加油,奥利给!让我们继续迈向 Python 世界的更深处吧!
祝学习愉快,我们下次见啦~