62、集合运算和习题
2019-06-03 本文已影响2人
BeautifulSoulpy
当你对一件事怀着热爱,做到极致,就有机会从茫茫人海中脱颖而出,越来越优秀。
编程是一个开放性的事情;需要我们思考用户要的东西;
哈希的雪崩效应——小小的变化引起这个值巨大的变化;

1.set和线性结构
1.线性结构的查询时间复杂度是O(n),随着数据规模的增大而耗时间增长;
2.set.dict等结构,内部使用hash值作为Key,时间复杂度可以做到O(1),查询时间和数据规模无关;
可哈希的数据类型:(不可变类型)
数值型int\float\complex;
布尔值True\Flase;
字符串string\bytes
tuple
None
2.set的特性(可变、无序、去重)
set()开辟的无序空间,list()开辟的连续的内存空间;也不像链表(知道下一个点在哪里)
set() 去重复时重要的特性;可以进行集合运算;
3. 集合

集合中的方法:
方法 描述
add() 为集合添加元素
clear() 移除集合中的所有元素
copy() 拷贝一个集合
difference() 返回多个集合的差集
difference_update() 移除集合中的元素,该元素在指定的集合也存在。
discard() 删除集合中指定的元素
intersection() 返回集合的交集
intersection_update() 删除集合中的元素,该元素在指定的集合中不存在。
isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
issubset() 判断指定集合是否为该方法参数集合的子集。
issuperset() 判断该方法的参数集合是否为指定集合的子集
pop() 随机移除元素
remove() 移除指定元素
symmetric_difference() 返回两个集合中不重复的元素集合。
symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
union() 返回两个集合的并集
update() 给集合添加元素
4. 集合运算(前提是set)
4.1 关系测试:并集、交集、差集、对称差集
#交集 &
print(s1 & s2) #两个集合中的公共部分 intersection &
print(s1 &= s2) #两个集合中的公共部分 并就地修改 intersection_ &=
#并集 |
print(s1 | s2) #两个集合中所有的部分(去重) union(*other)=|
print(s1 |= s2) #两个集合中所有的部分(去重),并就地修改 update(*others) |=
#差集 -
print(s1 - s2) #用前面的内容减去后面的内容剩下的部分 difference() -(减号)
difference_update() -=
# 对称差集 ^
print(s1 ^ s2) #两个集合的并集 减去 两个集合的交集 ^ symmetric_difference()
print(s1 ^= s2) #两个集合的并集 减去 两个集合的交集 ^= symmetric_difference_update()
4.2 判断 == < > (< 和 > 都是包含关系,又叫 子集 和 超集)
print(s1 == s2)
print(s1 < s2)
print(s1 > s2)
5.集合应用
#1.共同好友问题: A好友ABC,B好友CBD,求共同好友
A={'A','B','C'}
B={'B','C','D'}
print(A&B)
{'A','B','C'}.intersection({'B','C','D'})
---------------------------------
{'C', 'B'}
Out[12]:
{'B', 'C'}
# 2.随机2组10个数字的列表,
#如下要求:1.统计20中有多少个不同的数字(取并集)
# 比较2组,不重复的数字有几个?分别是?
# 比较两组,重复的数字有几个?分别是?
import random
a=[]
b=[]
for i in range(10):
a.append(random.randint(10,20))
for _ in range(10):
b.append(random.randrange(10,21))
s1=set(a)
s2=set(b)
print(s1)
print(s2) #set自带去重复的功能
print(s1.union(s2)) #
print(s1.symmetric_difference(s2))
print(s1.intersection(s2))
-------------------------------------------------------------
{12, 13, 14, 16, 17, 20}
{12, 13, 14, 15, 17, 18, 20}
{12, 13, 14, 15, 16, 17, 18, 20}
{16, 18, 15}
{12, 13, 14, 17, 20}
总结:
关键是对称差集的理解;