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-集合运算

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