当你对一件事怀着热爱,做到极致,就有机会从茫茫人海中脱颖而出,越来越优秀。
编程是一个开放性的事情;需要我们思考用户要的东西;
哈希的雪崩效应——小小的变化引起这个值巨大的变化;
集合运算效率高;集合有集合运算,往往被人忽略;
回顾上节内容:
1.set和线性结构
1.线性结构的查询时间复杂度是O(n),随着数据规模的增大而耗时间增长;
2.set.dict等结构,内部使用hash值作为Key,时间复杂度可以做到O(1),查询时间和数据规模无关;
2.set的特性(可变、无序、去重)
set()开辟的无序空间,list()开辟的连续的内存空间;也不像链表(知道下一个点在哪里)
set() 去重复时重要的特性;可以进行集合运算;
可哈希的数据类型:(不可变类型)
数值型int\float\complex;
布尔值True\Flase;
字符串string\bytes
tuple
None
不可哈希类型:set()、list 本身, bytearray
集合与集合类型
集合是无序的,不具备记录元素位置或插入顺序的能力,所以集合不支持索引,切片或者其他类似序列的操作。
set特点:无序性、唯一性(不重复)、可变类型;
Python中有2种内置集合类型:set(可变集合)和frozenset(不可变集合)。
set集合
可变的集合类型,能够对集合内的元素进行更改,set集合是可变的,所以它不能用作字典的键或作为另一个集合的元素,但是它的元素必须是可哈希的对象(int, str, tuple, bool)
s = set(["1", "2", "3", "4"])
dic = {s:'123'} # set集合是可变不可哈希的,不能作为字典key
print(dic) # **TypeError**: unhashable type: 'set'
frozense集合
不可变的集合类型,集合的内容在创建以后不能被更改,所以它可以用作字典的键或者作为另一个集合的元素。
s = frozenset(["1", "2", "3", "4"])
dic = {s:'123'} # 可以正常使⽤了
print(dic) ==> {frozenset({'2', '4', '3', '1'}): '123'}
初始化一个空集;
emptySet = set()
1.集合方法:
方法 | 描述 |
---|---|
add() | 为集合添加元素 |
clear() | 移除集合中的所有元素 |
copy() | 拷贝一个集合 |
difference() | 返回多个集合的差集 |
difference_update() | 移除集合中的元素,该元素在指定的集合也存在。 |
discard() | 删除集合中指定的元素 |
intersection() | 返回集合的交集 |
intersection_update() | 删除集合中的元素,该元素在指定的集合中不存在。 |
isdisjoint() | 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。 |
issubset() | 判断指定集合是否为该方法参数集合的子集。 |
issuperset() | 判断该方法的参数集合是否为指定集合的子集 |
pop() | 随机移除元素 |
remove() | 移除指定元素 |
discard() | 移除一个元素,元素不存在,什么都不做; |
symmetric_difference() 返回两个集合中不重复的元素集合。 | |
symmetric_difference_update() | 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。 |
union() | 返回两个集合的并集 |
update() | 给集合添加多个元素(可迭代) |
2. 集合运算(前提是set)
2.1 关系测试:并集、交集、差集、对称差集
#交集 & intersection()
print(s1 & s2) #两个集合中的公共部分 intersection &
print(s1 &= s2) #两个集合中的公共部分 并就地修改 intersection_ &=
#并集 | union()
print(s1 | s2) #两个集合中所有的部分(去重) union(*other)=|
print(s1 |= s2) #两个集合中所有的部分(去重),并就地修改 update(*others) |=
#差集 - difference(*other)
print(s1 - s2) #用前面的内容减去后面的内容剩下的部分 difference() -(减号)
difference_update() -=
# 对称差集 ^
print(s1 ^ s2) #两个集合的并集 减去 两个集合的交集 ^ symmetric_difference()
print(s1 ^= s2) #两个集合的并集 减去 两个集合的交集 ^= symmetric_difference_update()
2.2 判断 == < > (< 和 > 都是包含关系,又叫 子集 和 超集)
print(s1 == s2)
print(s1 < s2)
print(s1 > s2)
3.集合运算(判断)
4.集合应用
#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}
总结:
1. 关键是对称差集的理解;
网友评论