Python学习笔记之集合类型(set, frozeset)

时间:2020-12-02 17:01:21
  • 集合对象是一组无序排列的可哈希的值,集合成员可以做字典的键。
  • 集合有两种类型,可变集合(set)和不可变集合(frozenset)

创建集合类型
     工厂方法 set(), frozenset()
     >>> s = set('hello')
     >>> s
     set(['h', 'e', 'l', 'o'])

     >>> t = frozenset(['12345678', 100])
     >>> t
     frozenset(['12345678', 100])

集合类型操作符
  • 成员关系(in, not in)
          判定耨个元素是否是一个集合中的成员。(*不使用与集合的子集和超集,使用<,>)
  • 集合等价/不等价(==, !=)
          当且仅当其中两个集合的成员相同,被用于相同或不同的集合之间做比较。
  • 子集/超集(<, <=, >, >=)
        检查集合是否是其他集合的超集或子集
        >>> set('abcd') < frozenset('abcde123')
        True
          
         "<, >"等是判断集合的超集和子集,而不是通常的大于和小于,所以以下都为False
        >>> set('abcd') < set('abce123') 
        False
        >>> set('abcd') > set('abce123')
        False
  • 联合(|),等价方法union()
  • 交集(&),等价方法intersection()
  • 差补/相对集合(-),等价方法difference()
  • 对称查分(^),等价方法symmetric_difference(),只不能同时属于两个集合的元素
  • 混合集合类型,集合操作结果的类型同左边的集合类型
      >>> s = set('abcd')
      >>> f = frozenset('1234')
      >>> s |f
      set(['a', 'c', 'b', 'd', '1', '3', '2', '4']) #结果和s的类型相同,即Set
      >>> f|s
      frozenset(['a', 'c', 'b', 'd', '1', '3', '2', '4']) #结果和f的类型相同,即frozenset

只用于可变集合(set)的操作符
  • (Union) Update ( |= ), 等同于update()
  • 保留/交集更新( &= ),等同于intersection_update()
  • 差更新( -= ),等同于difference_update()
  • 对称差分更新( ^= ),等同于symmetric_difference_update()
标准函数
     len()
     set(), frozenset()

集合的内建方法(set,frozenset)
  • issubset(t),是否是给定集合t的子集
  • issuperset(t),是否是给定集合t的超集
  • union(t)
  • intersection(t)
  • difference(t)
  • symmetric_difference(t)
  • copy(t),浅复制
只用于可变集合的方法(set)
  • s.update(t),将集合t添加到集合s中,即s现在包含s或t的成员
  • s.intersection_udpate(t),s中的成员共同属于s和t的元素
  • s.difference_update(t),s中的成员属于s但不包含在t中的元素
  • s.symmetric_differrence_update(s),s中的成员更新为包含在s或t中,但不是s和t的共有元素
  • s.add()
  • s.remove(),从集合s中删除对象obj,如obj不是集合s中的元素,引发KeyError错误
  • s.discard(),如obj是集合s中的元素,这从s中删除对象obj,如obj不是集合s中的元素,也不会引发错误。
  • s.pop(),删除集合s中的任意一个对象,并返回它
  • s.clear()
操作符和内建方法的比较
     当用操作符时,操作符两边的操作数必须是集合
     使用内建方法时,对象可以是迭代类型
>>> s = set('abcd')
>>> s2 = set('xyz')
>>> s |= s2  # s, s2都是set, "|="操作OK
>>> s
set(['a', 'c', 'b', 'd', 'y', 'x', 'z'])

>>> l = [1,2,3,4]
>>> s |= l               #l为list类型, 出现异常
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    s |= l
TypeError: unsupported operand type(s) for |=: 'set' and 'list'

>>> s.update(l)   #内建方法update, 可以使用list等迭代类型
>>> s
set([1, 2, 3, 4, 'a', 'c', 'b', 'd', 'y', 'x', 'z'])