集合
可变集合:无序的不重复元素序列,分为可变集合与不可变集合,
特点:
1.无序2.元素不重复3.元素不可以修改4.集合元素只能是数字、字符及元组(这一点是由于3)不可修改数据类型:
数字、字符串、元组
使用{}花括号标示,创建方法:集合名称={元素1,元素2...元素n}
注意:集合在python3.7版本变为有序,但这个有序是因为底层存储方式改变造成的偶然有序性,这个有序性不值得信任。一般用不到,默认无序
可变集合元素的添加
add()添加单个元素
update()添加多个元素
可变集合元素的删除
remove()会报错
discard:删除指定元素,不存在不会报错
pop()删除第一个元素,集合是空的,会报错
my_set3 ={2455,6666}
c=my_set3.pop()
print(c)
结果:6666
疑问:为啥删除的不是2455
解答:集合本身无序,所以这个pop删除的第一个也是随机的
可变集合元素的查找
in:使用关键字查找,存在返回True
部分其他操作
len()
set()
# set函数 如果不填参数,就会返回一个空集合
# 需要1个参数,这个参数必须为一个序列
my_set =set('acd')
print(my_set)
copy()
clear():清空集合
intersection():求交集
union():求并集
issubset():求两个集合是否子集关系
issuperset():求两个集合是不是父集关系
集合推导式:
{
expression for item in iterable if condition
}
不可变集合
元素和元素个数均不能改变;
使用frozenset函数进行创建且之前的增删操作都不可以使用,但可以使用求交并集
课后习题:
选择题
1.以下关于集合在数据去重方面的应 用,错误的是?
A 可以将列表转换为集合去除重复元 素,然后再转换回列表
B 集合去重后元素的顺序会改变
C 对于包含可变元素的列表,不能直接使用集合去重
D 集合去重的效率比手动遍历去重的效率低
总结:
c选项正确,原因:可变元素(如 list、dict、set)可以修改内部状态,比如增删元素。一旦内容改变,它的哈希值理论上也应该跟着变,但 Python 无法动态追踪这种变化。如果允许可变元素放入集合,就会导致一个致命问题:集合无法再正确判断元素是否重复,也无法通过哈希值快速定位元素。所以不能 直接使用集合去重。
2.若要创建一个空集合,以下正确的方 式是?
A {}
B set()
C []
D ()
正确答案 B 我的答案 A
总结:
1.我在想的是集合的形式 元素名称={元素1,元素2,元素3}就直接选了A,将表示形式和创建形式混淆
使用 set () 函数可以创建一个空集 合,B 选项正确。{} 在 Python 中用 于创建空字典,A 选项错误。[] 用于 创建空列表,C 选项错误。() 用于创 建空元组,D 选项错误。 A {}
编程题
2.给定三个列表group_a=['apple','banana','orange','grape']
group_b = ['banana', 'grape','watermelon'] , group_c =
['orange', 'peach'] 。编写一个
Python 脚本,执行以下操作并打印
结果:
# 找出只在 group_a 中出现的水果。
# 找出同时在 group_a 和group_b 中出现,但不在group_c 中出现的水果。
# 找出所有只在一个组中出现的水果 (A独有 或 B独有 或 C独
参考答案:
group_a = ['apple', 'banana', 'orange', 'grape']
group_b = ['banana', 'grape', 'watermelon']
group_c = ['orange', 'peach']
set_a = set(group_a)
set_b = set(group_b)
set_c = set(group_c)
# 1. 只在 group_a 中出现的水果 (A - (B U C))
only_in_a = set_a - (set_b | set_c)
# 或者: only_in_a = set_a.difference(set_b.union(set_c))
print(f"1. 只在 group_a 中出现的水果: {only_in_a}")
# 2. 同时在 A 和 B 中,但不在 C 中 ((A ∩ B) - C)
in_a_and_b_not_c = (set_a & set_b) - set_c
# 或者: in_a_and_b_not_c = set_a.intersection(set_b).difference(set_c)
print(f"2. 同时在 A 和 B 中但不在 C 中的水果: {in_a_and_b_not_c}")
# 3. 只在一个组中出现的水果 (A Δ B Δ C 的部分变形,或者分别计算差集)
# (A - (B U C)) U (B - (A U C)) U (C - (A U B))
only_in_one_group = (set_a - (set_b | set_c)) | \
(set_b - (set_a | set_c)) | \
(set_c - (set_a | set_b))
print(f"3. 只在一个组中出现的水果: {only_in_one_group}")
# 另一种计算方法 3: 使用对称差 (需要注意对称差的定义)
# (A U B U C) - (A ∩ B) - (A ∩ C) - (B ∩ C) + 2*(A ∩ B ∩ C) 逻辑比较复杂
# 或者更直观:计算全集,减去两两交集,再加上三者交集(容斥原理思想)
# all_fruits = set_a | set_b | set_c
# intersection_ab = set_a & set_b
# intersection_ac = set_a & set_c
# intersection_bc = set_b & set_c
# intersection_abc = set_a & set_b & set_c
# only_in_one_group_alt = (all_fruits - intersection_ab - intersection_ac - intersection_bc) | intersection_abc # 这个计算不对
# 确认逻辑:(AΔBΔC) 不完全是这个意思。还是上面的差集组合最清晰。
核心部分
找出只在 group_a 中出现的水果。
用数学的理论分析为: (A - (B U C))
代码:only_in_a = set_a - (set_b | set_c)
找出同时在 group_a 和group_b 中出现,但不在group_c 中出现的水果。
用数学的理论分析为: ((A ∩ B) - C)
代码:(set_a & set_b) - set_c
找出所有只在一个组中出现的水果 (A独有 或 B独有 或 C独
用数学的理论分析为:(A - (B U C)) U (B - (A U C)) U (C - (A U B))
**代码:only_in_one_group = (set_a - (set_b | set_c)) | (set_b - (set_a | set_c)) | (set_c - (set_a | set_b))**
我的答案:
# 1.找出只在 group_a 中出现的水果。目标:apple
# 三个列表
group_a=['apple','banana','orange','grape']
group_b = ['banana', 'grape','watermelon']
group_c =['orange', 'peach']
# 将三个列表都转换为集合
set_a = set(group_a)
set_b = set(group_b)
set_c = set(group_c)
# print(set_a)
# 找出a与剩下两组不同的水果
set1 = set_a.difference(set_b)
#print(f"a与b不同的是{set1}")
set2 = set_a.difference(set_c)
# 将不同水果再求交集
result1 =set1.intersection(set2)
print(f"只在 group_a 中出现的水果是:{result1}")
# 2.找出同时在 group_a 和group_b 中出现,
# 但不在group_c 中出现的水果。
result2 = set_a.intersection(set_b)
print(f"同时在group_a 和group_b,不在group_c 中出现的水果是:{result2}")
# 3.找出所有只在一个组中出现的水果 (A独有 或 B独有 或 C独
# group_a=apple
# group_b='watermelon'
# group_c='peach'
# 统计水果出现的次数
only_one_group = (set_a - set_b - set_c) | (set_b - set_a - set_c) | (set_c - set_a - set_b)
print(f"只在一个组中出现的水果是{only_one_group}")
总结:
1.我自己写代码的时候没有用数学理论先分析,纯自己想
3.运用到了difference()函数,可以找出两个集合不同的元素
2.没有想到使用位运算符,第三个实在没想出来,借助了AI,发现可以使用位运算符
浙公网安备 33010602011771号