前言:
一、集合
Python 中的集合同数学中的集合概念类似,也是用于保存不重复元素的。它有可变集合(set)和不可变集合(fozenset)两种。本节所要介绍的可变集合是无序可变序列,而不可变集合在本书中不做介绍。在形式上,集合的所有元素都放在一对{}
中,两个相邻元素间使用,
分隔。集合最好的应用就是去掉重复元素,因为集合中的每个元素都是唯一的。
Python中的集合(set)是一个无序的、不包含重复元素的数据结构。以下是关于集合的一些基本操作:
1、集合的创建
创建集合非常简单,可以使用大括号 {}
或者 set()
函数。如果使用大括号,需要注意空集合不能使用 {}
来创建,因为空花括号在Python中是一个空字典的表示。因此,创建空集合需要使用 set()
函数。
# 使用set()函数创建集合
my_set = set()# 使用大括号创建集合
my_set = {1, 2, 3}# 创建空集合
my_set = set()
实例训练27 -创建保存学生选课信息的集合
python ={'绮梦','冷伊一','香凝','梓轩'} #保存选择Python语言的学生姓名
C={'冷伊一','零语','梓轩','圣博',} #保存选择C语言的学生姓名
print('选择Python语言的学生有: ',python,'\n') #输出选择Python语言的学生姓名
print('选择C语言的学生有: ',C) # 输出选择C语言的学生姓名
2、集合的添加和删除
- 添加元素:使用
add()
方法向集合中添加元素。 - 删除元素:使用
remove()
方法删除集合中的元素,如果元素不存在会抛出KeyError
。可以使用discard()
方法,它在元素不存在时不会抛出错误。
# 添加元素
my_set = {1, 2, 3}
my_set.add(4) # 现在 my_set 变为 {1, 2, 3, 4}# 删除元素
my_set.remove(2) # 移除元素 2,现在 my_set 变为 {1, 3, 4}# 安全删除元素
my_set.discard(5) # 元素 5 不存在,但不会抛出错误
如果需要从集合中移除一个元素,并且这个元素之后不再使用,可以使用 pop()
方法,它会随机移除一个元素并返回。
# 随机移除一个元素
element = my_set.pop() # 返回并移除一个元素
实例训练28 -学生更改选学课程
python = set(['绮梦','冷伊一','香凝','梓轩' ]) #保存选择Python语言的学生姓名
python.add('零语') #添加一个元素
C = set(['冷伊一','零语','梓轩','圣博']) #保存选择C语言的学生姓名
C.remove('零语') #删除指定元素
print('选择Python语言的学生有: ',python,'\n') #输出选择Python语言的学生姓名
print('选择C语言的学生有: ',C) # 输出选择C语言的学生姓名
3、集合的交集、并集和差集运算
- 交集:使用
intersection()
方法或者&
运算符。 - 并集:使用
union()
方法或者|
运算符。 - 差集:使用
difference()
方法或者-
运算符。
# 交集
set_a = {1, 2, 3}
set_b = {2, 3, 4}
intersection = set_a.intersection(set_b) # 或者 set_a & set_b
# intersection 现在是 {2, 3}# 并集
union = set_a.union(set_b) # 或者 set_a | set_b
# union 现在是 {1, 2, 3, 4}# 差集
difference = set_a.difference(set_b) # 或者 set_a - set_b
# difference 现在是 {1}
集合的对称差集(symmetric difference)操作会找出两个集合中不共有的元素。换句话说,它会包含那些只在其中一个集合中出现的元素。集合对称差集运算,使用 symmetric_difference()
方法或者 ^
运算符,它返回两个集合中不重复的元素。
# 对称差集
symmetric_diff = set_a.symmetric_difference(set_b) # 或者 set_a ^ set_b
# symmetric_diff 现在是 {1, 4}
实例训练29 -对选课集合进行交集、并集和差集运算
python = set(['绮梦','冷伊一','香凝','梓轩' ]) #保存选择Python语言的学生姓名
C = set(['冷伊一','零语','梓轩','圣博']) #保存选择C语言的学生姓名
print('选择Python语言的学生有: ',python,'\n') #输出选择Python语言的学生姓名
print('选择C语言的学生有: ',C) #输出选择C语言的学生姓名
print('交集运算: ',python & C) #输出既选择了python语言又选择了C语言的学生
print('并集运算: ',python | C) #输出参与选课的全部学生姓名
print('并集运算: ',python - C) #输出只选择了python语言但没有选择C语言的学生
以上就是Python集合的基本操作。集合是一个强大的数据结构,适用于需要快速成员检查、消除重复项和集合运算的场景。
二、列表、元组、字典和集合的区别
列表、元组、字典和集合的区别表:
数据结构 | 是否可变 | 是否重复 | 是否有序 | 定义符号 |
---|---|---|---|---|
列表(List) | 可变 | 允许 | 有序 | [] 或 list() |
元组(Tuple) | 不可变 | 不允许 | 有序 | () 或 tuple() |
字典(Dictionary) | 可变 | 键不允许,值允许 | 键无序(Python 3.7+版本中保持插入顺序) | {} 或 dict() |
集合(Set) | 可变 | 不允许 | 无序 | {} 或 set() |
这个表格简洁地总结了列表、元组、字典和集合的基本特性。
实例训练30 -输出“王者荣耀”的游戏角色,根据属性
# 王者荣耀的游戏角色列表
heroes = ["亚瑟","鲁班七号","妲己","孙悟空","貂蝉","赵云","后羿","孙尚香","诸葛亮","露娜",# ...更多英雄
]# 输出王者荣耀的游戏角色
for hero in heroes:print(hero)
实例训练31 -模拟火车订票系统
class TrainInfo:def __init__(self, train_number, destination, departure_time, arrival_time, seats_total, seats_available):self.train_number = train_number # 车次self.destination = destination # 目的地self.departure_time = departure_time # 发车时间self.arrival_time = arrival_time # 到达时间self.seats_total = seats_total # 座位总数self.seats_available = seats_available # 可用座位数def display_info(self):print(f"车次: {self.train_number}")print(f"目的地: {self.destination}")print(f"发车时间: {self.departure_time}")print(f"到达时间: {self.arrival_time}")print(f"座位总数: {self.seats_total}")print(f"当前可用座位数: {self.seats_available}")print('-' * 40)class TicketBookingSystem:def __init__(self):self.trains_info = {"T123": TrainInfo("T123", "北京", "08:00", "12:00", 100, 90),"T456": TrainInfo("T456", "上海", "09:00", "13:00", 120, 110),# 添加更多车次信息}def show_train_info(self, train_number):if train_number in self.trains_info:self.trains_info[train_number].display_info()else:print("没有找到该车次的信息。")# 创建订票系统实例
booking_system = TicketBookingSystem()# 用户输入车次
user_input = input("请输入车次:")
booking_system.show_train_info(user_input)
实例训练32 -电视剧的收视率排行榜
class TVShow:def __init__(self, name, rating):self.name = name # 电视剧名称self.rating = rating # 收视率def __str__(self):return f"{self.name}: {self.rating}%"class TVRatingsChart:def __init__(self):self.shows = [] # 存储电视剧的列表def add_show(self, show):# 添加电视剧到列表,并保持列表按收视率降序排序self.shows.append(show)self.shows.sort(key=lambda x: x.rating, reverse=True)def remove_show(self, show_name):# 移除指定的电视剧self.shows = [show for show in self.shows if show.name != show_name]def display_chart(self):# 显示收视率排行榜print("电视剧收视率排行榜:")for show in self.shows:print(show)print('-' * 40)# 创建收视率排行榜实例
ratings_chart = TVRatingsChart()# 添加一些电视剧和收视率
ratings_chart.add_show(TVShow("权力的游戏", 8.9))
ratings_chart.add_show(TVShow("老友记", 8.8))
ratings_chart.add_show(TVShow("绝命毒师", 9.5))
ratings_chart.add_show(TVShow("生活大爆炸", 8.2))# 显示排行榜
ratings_chart.display_chart()# 移除一个电视剧
ratings_chart.remove_show("生活大爆炸")# 再次显示排行榜
print("移除《生活大爆炸》后的排行榜:")
ratings_chart.display_chart()
实例训练33 -统计需要取快递人员的名单
class ExpressDelivery:def __init__(self):self.recipients = [] # 存储需要取快递的人员名单def add_recipient(self, name):# 添加需要取快递的人员if name not in self.recipients:self.recipients.append(name)print(f"{name} 已添加到取快递名单。")else:print(f"{name} 已经在名单中。")def remove_recipient(self, name):# 从名单中移除人员if name in self.recipients:self.recipients.remove(name)print(f"{name} 已从取快递名单中移除。")else:print(f"{name} 不在名单中。")def list_recipients(self):# 显示所有需要取快递的人员名单if self.recipients:print("需要取快递的人员名单:")for i, name in enumerate(self.recipients, 1):print(f"{i}. {name}")else:print("目前没有需要取快递的人员。")# 创建快递派送系统实例
delivery_system = ExpressDelivery()# 添加需要取快递的人员
delivery_system.add_recipient("张三")
delivery_system.add_recipient("李四")
delivery_system.add_recipient("王五")# 显示需要取快递的人员名单
delivery_system.list_recipients()# 尝试重复添加人员
delivery_system.add_recipient("张三")# 移除一个人员
delivery_system.remove_recipient("李四")# 再次显示需要取快递的人员名单
delivery_system.list_recipients()