• Python-数据结构之set(集合)


    阅读目录:

      1、集(set)

      2、set的元素

      3、set增加

      4、set删除

      5、set修改、查询

      6、set 和线性结构

      7、集合

      8、集合运算

      9、练习题

      1、集(set)

       约定:

        set翻译为集合

        colection 翻译为集合类型,是一个大概念

      set:可变,无序,不重复,可迭代的元素集合(一般一个容器都是可以迭代的,例如一个箱子里的东西都可以一个个拿出来)

     1 s = set(range(7))
     2 s # {0, 1, 2, 3, 4, 5, 6]
     3 # s = {} 这是空字典
     4 # s = set() 定义空set只能这样
     5 s1 = set('abc')
     6 s1 # {'a', 'b', 'c'}
     7 
     8 s2 = set('a' * 4) # 去重
     9 s2 # {'a'}
    10 
    11 s3 = {1,2,3,1,2,3}
    12 s3 # {1, 2, 3}
    13 
    14 s4 = {1,'a',(12,3)}
    15 s4 # {(12, 3), 1, 'a'} # 无序,事实上,无序只是看起来无序,但是计算机内部是不可能五的
    test

    2、set的元素

    • set的元素要求必须是可以hash的,也就是说不可变的,如:list,set,dict都不能作为set的元素
    • 元素不可以索引,无序
    • set 可以迭代 
    • s = {1,2,3,(1,2,[4,5],3)} 这样也是错误的!  

    3、set增加:

      add(elem):返回None

        增加一个元素到set中,如果元素存在,什么都不做。

      update(*others):

        合并其他元素到set集合中,参数others 鄙俗是可迭代对象,就地修改

     1 s2.add(3)
     2 s2.add('dassda')
     3 s2.add('ad')
     4 s2 # {3, 'a', 'ad', 'dassda'}
     5 
     6 
     7 s3 = s2
     8 s3.update([1,2])# 可迭代对象
     9 s3 # {1, 2, 3, 'a', 'ad', 'dassda'}
    10 
    11 s3.update({'a','c','f'})
    12 s3 # {1, 2, 3, 'a', 'ad', 'c', 'dassda', 'f'}
    test-add-update

      哈希hash() 内建函数:如果参数不变,那么哈希值是定值。

        哈希的时间复杂度是O(1) 一步到位,例如,找某人,直接算出这个人的哈希值,可以去找房间号。

    4、set删除:

       remove(elem)--> None

        从set中移除一个元素,元素不存在,抛出KeyError异常。    

        不需要遍历,因为可以hash,很快就找到,但是频繁的对其删,增,代价要高,但是比list中的代价低多了(无序的)。

       discard(elem)---> None

        从set中移除一个元素,元素不存在,什么都不做

       pop() --->item

        移除并返回任意的元素,空集返回KeyError

       clear();移除所有元素

    5、set修改、查询

      修改:

        要么删除,要么加入新元素,没有必要修改。

      查询:非线性解构,无法查询

      遍历:迭代所有的元素

      成员运算符:in ,not in 

          #在set中效率要高很多,set中的元素是可hash,但是列表就不要用了。set的时间是用空间换来的,因为数据是散列的!

          意思就是 提供一个非常大的散列空间,即便只有两个元素!

      

    6、set 和线性结构:

      线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增加消耗

      set, dict 等结构,内部使用hash值 作为key,时间复杂度可以做到O(1),查询时间和数据规模无关。

      可hash:

        数值型int ,float, complex

        布尔型True, False

        字符串string

        元组 tuple

        None

        以上都是不可变类型,称为可哈希类型

    7、集合:

      基本概念:

        全集:

          所有元素的结合。例如实数集,所有实数组成的结合就是全集

        子集subset 和超集 superset

        真子集 和 真超集:

          A 是B 的子集,且A 不等于B ,A 就是B 的真子集,B 是A的真超集

        并集:多个集合合并的结果

        交集:多个集合的公共部分

        差集:集合中出去喝其他集合公共部分。

    8、集合运算:

       并集:

         将两个几个A 和B 的所有的元素合并到一起,组成的结合称为集合A 和集合B 的并集

         union(*others):返回和多个集合合并后的新的集合。

         | :运算符

         update(*others): 和多个集合合并,就地修改

         |= :运算符

    1 s = set(range(1,7))
    2 s1 = set(range(3,7))
    3 n = s | s1  # {1, 2, 3, 4, 5, 6}
    4 m = s1.union(s) # {1, 2, 3, 4, 5, 6}
    5 
    6 s |= s1 # 此时s 变为  {1, 2, 3, 4, 5, 6}
    7 s
    union-test

        

       交集:

          集合A 和B ,由 所有属于A 且属于B 的元素组成的集合

          intersection(*others) :返回和多个集合的交集

          &:运算符

          intersection-update(*others) :获取和多个集合的交集,并就地修改

          &= :运算符

    1 s1 = set(range(1,5))
    2 s2 = set(range(4,8))
    3 n = s1.intersection(s2)
    4 print(n) # {4}
    5 
    6 s1 &= s2
    7 print(s1) # 此时的s1 {4}
    intercetion-test

       差集:

          集合A 和B ,由所有属于A 且不属于B 的元素组成的集合。

          difference(*others):返回和多个集合的差集

          - : 运算符

          difference_update(*others ):获取和多个集合的差集并就地修改

          -= :运算符

    1 s1 = set(range(1,5))
    2 s2 = set(range(4,8))
    3 n = s1.difference(s2) # 是S1 - S2
    4 n # {1, 2, 3}
    5 
    6 s1 -= s2
    7 s1 # {1, 2, 3}
    difference-test

       对称差集:

          集合A 和B,由所有不属于A 和B  的交集元素组成的结合,记做:(A - B)U (B - A)

          symmetric_difference(other):返回和一个集合的差集

          ^ :运算符

          symmetric_differece_update(other):获取和另一个集合的差集并就地修改

          ^= : 运算符      

    1 s1 = set(range(1,5))
    2 s2 = set(range(4,8))
    3 s1 ^ s2 # {1, 2, 3, 5, 6, 7}
    4 
    5 s1 ^= s2
    6 s1,s2 # ({1, 2, 3, 5, 6, 7}, {4, 5, 6, 7})
    symmetric-test

      issubset(other)   :判断当前集合是否是另一个集合的子集   (  <=  )   

      set1 < set2 :判断set1 是否是set2的真子集

      issuperset(other) : 判断当前集合是否是other的超集 ( >=  )

      set1 > set2 :判断set1 是否是set2 的真超集

      isdisjoint(other):当前集合和另一个集合没有交集,没有交集返回True 

    1 s1 = set(range(1,5))
    2 s2 = set(range(4,8))
    3 s3 = {1,2}
    4 s4 = set(range(6))
    5 s3.issubset(s1) # True
    6 s4 > s1 # True
    test

    9、练习题:

      随机产生2组10个数字列表

        每个数字取值 [10 ,20 ]

        统计20个数字中一共有多少个不同数字?

        2组之间,不重复的数字有几个,分别是什么?

     1 import random
     2 
     3 s1 =  set([random.randrange(10,21) for _ in range(10)]) 
     4 s2 =  set([random.randrange(10,21) for _ in range(10)])
     5 print(s1,s2)
     6 a = s1.symmetric_difference(s2)
     7 print(a)
     8 
     9 c = s1 & s2
    10 print(c)
    11 
    12 s1.update(s2)
    13 print(s1)
    练习题解答

      

        

    为什么要坚持,想一想当初!
  • 相关阅读:
    Android微信九宫格图片展示控件
    ImageView设置rounded corner
    Android TitleBar推荐
    《Windows核心编程》目录索引
    《Windows内核分析》专题-索引目录
    wchar,char,string,wstring互转
    键盘过滤
    串口过滤
    Vmware中Linux 虚拟机与Windows物理机建立共享文件夹
    遍历某一进程模块
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9472583.html
Copyright © 2020-2023  润新知