生信程序员Python全栈工程师

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}

总结:
关键是对称差集的理解;
上一篇 下一篇

猜你喜欢

热点阅读