12.1-集合运算

作者: BeautifulSoulpy | 来源:发表于2019-08-29 09:10 被阅读0次
当你对一件事怀着热爱,做到极致,就有机会从茫茫人海中脱颖而出,越来越优秀。

编程是一个开放性的事情;需要我们思考用户要的东西;

哈希的雪崩效应——小小的变化引起这个值巨大的变化;

集合运算效率高;集合有集合运算,往往被人忽略;

回顾上节内容:

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. 关键是对称差集的理解;

相关文章

  • 12.1-集合运算

    集合运算效率高;集合有集合运算,往往被人忽略; 回顾上节内容: 1.set和线性结构 1.线性结构的查询时间复杂度...

  • sql server集合运算

    集合运算包含四种:1.并集运算2.交集运算3.差集运算 为什么使用集合运算:1.在集合运算中比联接查询和EXIST...

  • 第八章: 集合运算

    第八章: 集合运算 • 集合运算:是用来把两个或多个查询的结果集做并、交、差的集合运算,包含集合运算的查询称为复合...

  • 3.集合的运算(续)

    引入集合的运算(目的)——新集合 | 简化运算 运算规律&不同运算之间的规律 交的并=并的交

  • oracle学习笔记七——查询之集合运算

    七.集合运算 可以根据下图图示并文字理解集合运算集合运算示意图(1)union/union all 并集--uni...

  • java 学习规划

    位运算 % & | x++ ++x运算 集合-list 、ArrayList、 LinkedList、集合 Has...

  • 说说SQL的“非”

    获取所有非manager的员工emp_no -- EXCEPT 集合差运算 -- UNION 集合并运算 ...

  • KVC中的集合运算符

    简单实用的集合运算符 KVC中的集合运算符有以下三类: 1、简单集合运算符:@avg、@sum、@max、@min...

  • 有序集合间的对位运算

    有序集合间的对位运算,包括比较运算(>,<, 等于)和四则运算(+,-,*,/,%,\)。本问中讨论的集合,都是有...

  • 集合运算

    1.union 联合查询内容不对应的表 2.intersect 3.minus

网友评论

    本文标题:12.1-集合运算

    本文链接:https://www.haomeiwen.com/subject/hpsbectx.html