文章目录
- 1. Python集合概述
- 2. 创建集合
- 2.1 使用花括号 `{}` 创建集合
- 2.2 使用 `set()` 函数创建集合
- 2.3 创建空集合
- 3. 集合操作
- 3.1 添加和删除元素
- 3.2 集合的基本操作
- 3.3 集合的比较操作
- 3.4 不可变集合(frozenset)
- 4. 综合例子:图书管理系统
Python集合是一种无序、不重复元素的集。集合操作在处理数据的去重、成员关系测试等方面非常高效。本文将详细介绍Python集合的创建和各种集合操作,最后附上一个综合详细的例子,帮助您全面掌握Python集合的用法。
1. Python集合概述
集合(set)是Python内置的数据类型之一,用于存储多个不重复的元素。集合中的元素必须是可哈希的(immutable),这意味着列表和字典不能作为集合的元素,但元组可以。
2. 创建集合
2.1 使用花括号 {}
创建集合
最常用的创建集合的方法是使用花括号 {}
。
# 创建一个包含若干整数的集合
numbers = {1, 2, 3, 4, 5}
print(numbers) # 输出: {1, 2, 3, 4, 5}
2.2 使用 set()
函数创建集合
可以使用 set()
函数将其他数据类型转换为集合。
# 从列表创建集合
numbers_list = [1, 2, 3, 4, 5, 5]
numbers_set = set(numbers_list)
print(numbers_set) # 输出: {1, 2, 3, 4, 5}
# 从字符串创建集合
string_set = set("hello")
print(string_set) # 输出: {'h', 'e', 'l', 'o'}
2.3 创建空集合
创建空集合时,必须使用 set()
函数,而不是 {}
,因为 {}
会创建一个空字典。
# 创建空集合
empty_set = set()
print(empty_set) # 输出: set()
3. 集合操作
3.1 添加和删除元素
集合支持添加和删除元素的操作。
# 添加元素
fruits = {"apple", "banana"}
fruits.add("cherry")
print(fruits) # 输出: {'banana', 'cherry', 'apple'}
# 删除元素
fruits.remove("banana")
print(fruits) # 输出: {'cherry', 'apple'}
# 使用 discard 删除元素,如果元素不存在也不会报错
fruits.discard("banana")
print(fruits) # 输出: {'cherry', 'apple'}
# 使用 pop 删除并返回一个随机元素
popped_fruit = fruits.pop()
print(popped_fruit) # 输出: cherry (结果可能不同)
print(fruits) # 输出: {'apple'} (结果可能不同)
3.2 集合的基本操作
集合支持一系列基本操作,如并集、交集、差集和对称差集。
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 并集
union_set = set_a | set_b
print(union_set) # 输出: {1, 2, 3, 4, 5, 6}
# 交集
intersection_set = set_a & set_b
print(intersection_set) # 输出: {3, 4}
# 差集
difference_set = set_a - set_b
print(difference_set) # 输出: {1, 2}
# 对称差集
symmetric_difference_set = set_a ^ set_b
print(symmetric_difference_set) # 输出: {1, 2, 5, 6}
3.3 集合的比较操作
集合之间可以进行各种比较操作。
set_a = {1, 2}
set_b = {1, 2, 3, 4}
# 子集
is_subset = set_a <= set_b
print(is_subset) # 输出: True
# 真子集
is_proper_subset = set_a < set_b
print(is_proper_subset) # 输出: True
# 超集
is_superset = set_b >= set_a
print(is_superset) # 输出: True
# 真超集
is_proper_superset = set_b > set_a
print(is_proper_superset) # 输出: True
3.4 不可变集合(frozenset)
Python 提供了 frozenset
,一种不可变的集合。一旦创建,frozenset
中的元素就不能被改变。
# 创建 frozenset
immutable_set = frozenset([1, 2, 3, 4])
print(immutable_set) # 输出: frozenset({1, 2, 3, 4})
# 尝试添加元素会报错
# immutable_set.add(5) # AttributeError: 'frozenset' object has no attribute 'add'
4. 综合例子:图书管理系统
以下是一个图书管理系统的例子,展示了集合在处理图书标签中的应用。
class Library:
def __init__(self):
self.books = {}
def add_book(self, title, author, year, tags):
"""
添加图书信息
:param title: 图书标题
:param author: 图书作者
:param year: 出版年份
:param tags: 图书标签(集合)
"""
if title in self.books:
print(f"书籍 '{title}' 已存在。")
else:
self.books[title] = {
"author": author,
"year": year,
"tags": set(tags)
}
print(f"书籍 '{title}' 添加成功。")
def remove_book(self, title):
"""
删除图书信息
:param title: 图书标题
"""
if title in self.books:
del self.books[title]
print(f"书籍 '{title}' 已删除。")
else:
print(f"书籍 '{title}' 未找到。")
def update_tags(self, title, new_tags):
"""
更新图书标签
:param title: 图书标题
:param new_tags: 新标签(集合)
"""
if title in self.books:
self.books[title]["tags"].update(new_tags)
print(f"书籍 '{title}' 的标签已更新。")
else:
print(f"书籍 '{title}' 未找到。")
def search_by_tag(self, tag):
"""
根据标签搜索图书
:param tag: 标签
:return: 包含该标签的图书列表
"""
result = [title for title, info in self.books.items() if tag in info["tags"]]
return result
def display_books(self):
"""
显示所有图书信息
"""
if not self.books:
print("图书馆中没有书籍。")
else:
for title, info in self.books.items():
print(f"标题: {title}, 作者: {info['author']}, 出版年份: {info['year']}, 标签: {info['tags']}")
# 创建图书馆实例
library = Library()
# 添加图书
library.add_book("Python编程", "Guido van Rossum", 1991, {"编程", "Python", "计算机"})
library.add_book("学习Python", "Mark Lutz", 2013, {"编程", "Python", "教程"})
library.add_book("深入理解计算机系统", "Randal E. Bryant", 2015, {"计算机", "系统", "基础"})
# 更新标签
library.update_tags("Python编程", {"经典", "入门"})
# 搜索图书
search_result = library.search_by_tag("Python")
print("包含标签 'Python' 的书籍:", search_result)
# 显示所有图书
library.display_books()
运行结果如下:
在这个综合详细的例子中,我们实现了一个简单的图书管理系统,展示了集合在处理图书标签中的应用。通过这个例子,我们可以看到集合的创建、操作和应用场景。希望本文对您理解和应用Python集合有所帮助。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |