• Python—数据类型之集合(Set)


    1.集合是一个无序的,且不重复元素的集合。它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。

    2.基本功能包括关系测试和消除重复元素。注意:集合存在的意义就是去重和关系运算。

    • 去重,把一个列表变成集合,就自动去重了。
    • 关系测试,测试两组数据之前的交集、差集、并集等关系。

    3.集合中的三个特征

    • 确定性(元素必须是可hash)
    • 互异性(去重)
    • 无序性(集合中的元素没有先后之分)如集合{1,2,3}和集合{2,3,1}算作一个集合

    集合的创建

    可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。大括号也不可以创建元素含有字典与列表的集合。

    创建set需要一个list或者tuple或者dict作为输入集合。其中重复元素在set中会自动过滤。

    集合可以通过可迭代对象(字符串、元组、列表等)进行创建;集合中的元素不可重复;集合中的元素无序排列。

    创建空的集合:s = set(),不能用 { } 来创建空集合。

    创建非空集合:s = {1,2,3,4},或者 s = set(iterable)。

    # 创建空集合
    set1 = set()
    print(set1, type(set1))      # (set([]),  <type 'set'>)
     
    # 创建非空集合
    set1 = {1, 2, 2}
    print(set1, type(set1))      # (set([1, 2]),  <type 'set'>)
    set2 = set({1, 2, 2})
    print(set2, type(set2))      # (set([1, 2]),  <type 'set'>)
    set3 = set('abcdefabcd')
    set4 = set(['a','b','c','a'])
    set5 = set(('a','b','c','a'))
    set6 = set({'a':1, 'b':2})
    set7 = set(range(1, 10, 3))
    print(set3, type(set3))      # (set(['a', 'c', 'b', 'e', 'd', 'f']),  <type 'set'>)
    print(set4, type(set4))      # (set(['a', 'c', 'b']),  <type 'set'>)
    print(set5, type(set5))      # (set(['a', 'c', 'b']),  <type 'set'>)
    print(set6, type(set6))      # (set(['a', 'b']),  <type 'set'>)
    print(set7, type(set7))      # (set([1, 4, 7]),  <type 'set'>)
     
    # 集合推导式
    set1 = {x for x in 'abracdabra' if x not in 'abc'}
    print(set1, type(set1))      # (set(['r', 'd']),  <type 'set'>)
    

    集合的常用方法:见help(set)

    添加元素

    set1 = {'1', '2'}
    set2 = {'1', '2'}
    set3 = {'1', '2'}
    
    set1.add('3')          # add的作用相当于列表中的append方法,但是添加新元素时,如果存在就不添加。
    print set1             # set(['1', '3', '2'])
    
    set2.update('2345')     # update 类似于列表中的extend方法,update方法可以支持同时传入多个参数
    print set2              # set(['1', '3', '2', '5', '4'])
    
    set3.update(['6', '8'], 'de')  # 添加列表到集合,列表元素会被分解为单个元素后添加到集合
    print set3                     # set(['e', 'd', '1', '2', '6', '8'])
    

    删除元素

    s1 = set(['Python','Java','C','C++','C#'])
    s2 = set(['Python','Java','C','C++','C#'])
    s3 = set(['Python','Java','C','C++','C#'])
    
    s1.remove('C++')     # 使用remove(element)方法删除指定元素,参数element为需要删除的元素。如果集合中不存在element元素,则会抛出异常。
    s2.discard('C++')    # 使用discard(element)方法删除指定元素,参数element为需要删除的元素。如果集合中不存在element元素,不会抛出异常。
    print s1      # set(['Python', 'C#', 'C', 'Java']) 
    print s2      # set(['Python', 'C#', 'C', 'Java']) 
    
    print s3.pop()      # Python  随机删除一个元素。由于集合是无序的,pop返回的结果不能确定,且当集合为空时调用pop会抛出KeyError错误。
    print s3            # set(['C#', 'C', 'Java', 'C++'])
    
    s3.clear()    # 清空集合
    print s3      # set([])
    del s3        # 删除整个集合:del set
    print s3      # NameError: name 's3' is not defined
    

    查找元素

    s1 = set(['Python','Java','C','C++','C#'])
    for i in s1:
        print i
    

    集合的运算

    交集、并集、补集、差集、子集、超集

    in /not in运算符:in等同于字典的in,用于集合中,当某个值存在于集合中,返回True,否则返回False。not in 与in 返回值相反。集合的in / not in 运算符的速度快于序列。

    s1 = {1, 2, 3}    
    s2 = {3, 4, 5}
    
    # 交集 & 或者 intersection()
    print s1 & s2              # {3}
    print s1.intersection(s2)  
    
    # 并集 | 或者 union()
    print s1 | s2              # {1, 2, 3, 4, 5}
    print s1.union(s2)
    
    # 补集(反交集) ^ 或者 symmetric_difference()
    print s1 ^ s2              # {1, 2, 4, 5}
    print s1.symmetric_difference(s2)
    
    # 差集 - 或者 difference()
    print s1 - s2              # {1, 2}
    print s1.difference(s2)
    
    # 超集>:判断一个集合是另一个集合的超集,使用 >= 也可以
    print {1,2,3} > {1,2}      # True  {1,2,3} 是 {1,2} 的超集
    print {1,2,3}.issuperset({1,2})
    
    # 子集<:判断一个集合是另一个集合的子集,使用 <= 也可以
    print {1,2} < {1,2,3}      # True  {1,2} 是 {1,2,3} 的子集
    print {1,2}.issubset({1,2,3})
    
    print {1,2,3} == {3,2,1}   # True
    print {1,2,3} != {3,2,1}   # False
    
    print 1 in {1,2,3}         # True
    print 1 not in {1,2,3}     # False
    

    集合的函数

    len(x)  max(x)  min(x)  sum(x)  any(x)  all(x)

    s1 = {1, 2, 3, 6}    
    print len(s1)      # 4
    print max(s1)      # 6
    print min(s1)      # 1
    print sum(s1)      # 12
    print any(s1)      # True
    print all(s1)      # True
    

    补充:集合数据类型可以去重

    arry = [1, 2, 3, 4, 6, 3, 8, 2]
    
    set1 = set(arry)
    print set1      # {1, 2, 3, 4, 6, 8}
    arry = list(set1)
    print arry      # [1, 2, 3, 4, 6, 8]
    

      

  • 相关阅读:
    【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆
    【BZOJ2843】极地旅行社 离线+树链剖分+树状数组
    【BZOJ3251】树上三角形 暴力
    SQL学习笔记三(补充-3)之MySQL完整性约束
    SQL学习笔记三(补充-2)之MySQL数据类型
    SQL学习笔记三(补充-1)之MySQL存储引擎
    SQL学习笔记二之MySQL的数据库操作
    SQL学习笔记一之初识数据库
    深入理解Python中的元类(metaclass)
    Web安全之BurpSuite抓取HTTPS请求
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/12122956.html
Copyright © 2020-2023  润新知