集合中的方法:利用set()创建的集合是可变集合,它的类型是不可哈希(unhashable)的。对于这句话的理解是,set()创建的集合,整体上是可变的,可以增、删;但集合中的元素(个体)是不可变(hashable)的,不能被修改,且集合中的元素不能是列表、字典等可变类型的对象。

  add()方法:向集合中增加一个元素。如果要增加的元素已存在于集合中,则什么也不做。add()方法必须传入一个明确的不可变的参数,因为集合是无序的,所以元素会被加到集合的任意位置。

>>> a = set([1, 2, 'q'])
>>> a
{1, 2, 'q'}
>>> a.add(6)    # 增加一个整数
>>> a
{1, 2, 6, 'q'}
>>> a.add('www')    # 增加一个整数
>>> a
{1, 2, 'www', 6, 'q'}
>>> a.add(('s', 7))    # 增加一个整数
>>> a
{1, 2, 'www', 6, 'q', ('s', 7)}
>>> a.add({1, 0, 'r'})    # 增加的元素必须是hashable的
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> a.add([2, 7])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> a.add({'A':99})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

  update()方法:合并集合或其他不可变的对象到另一个集合中,以更新该集合。

>>> set1 = {1, 3, 'a'}
>>> set2 = {'b', 'A'}
>>> set1.update(set2)    # 合并集合
>>> set1    # set1被修改
{'a', 1, 3, 'A', 'b'}
>>> set2    # set2不变
{'A', 'b'}
>>> set2.update('Java')    # 还可合并其他不可变类型的对象,如字符串
>>> set2
{'a', 'J', 'A', 'v', 'b'}
>>> set2.update(('g', 9))    # 如元组
>>> set2
{'A', 9, 'v', 'a', 'g', 'J', 'b'}

  pop()方法:删除集合中的一个元素。此方法没有参数,是随机删除集合中的一个元素,并将此元素返回。当集合为空时,若继续删除,则报错。

>>> set1 = {3, 'A'}
>>> set1.pop()    # 不传参数,随机删除一个元素,并返回
3
>>> set1.pop()
'A'
>>> set1.pop()    # 集合为空时,报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'

  remove方法:删除集合中的一个指定的元素。此方法必须提供一个参数,该参数即为要删除的元素,不返回任何值,只是在原地修改集合。若指定的要删除的元素不存在于集合中,则报错。

>>> set1 = {3, 'A'}
>>> set1.remove('A')    # 删除指定元素,没有任何返回值
>>> set1    # 原地修改集合
{3}
>>> set1.remove(6)    # 若要删除的元素不存在,报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 6

  discard()方法:作用与用法同remove()方法,区别在于若要删除的对象不存在于集合中,则什么也不做。

>>> set1 = {3, 'A'}
>>> set1.discard('A')    # 删除指定元素,没有任何返回值
>>> set1    # 原地修改集合
{3}
>>> set1.discard('B')    # 若要删除的元素不存在,则什么也不做

  clear()方法:清空集合。清空集合中的所有元素,清空后的集合对象依然存在,只是变成一个空集合。

>>> set1 = {3, 'A'}
>>> set1.clear()    # 清空集合,不返回任何值
>>> set1    # 清空后的集合对象依然存在,只是变成一个空集合
set()

  del:删除集合。集合对象将完全被删除,集合对象将不存在于内存中了。

>>> set1 = {3, 'A'}
>>> del set1    # 完全删除集合对象
>>> set1    # 被删除的集合对象不再存在
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'set1' is not defined

  不变的集合:以set()创建的集合都是可变几何,集合对象可以被原地修改,即集合对象时不可哈希(unhashable)的。以frozenset()创建的集合则是不可变的,集合对象不能实现增加或删除,即可哈希(hashable)的。此时,set中的增加或删除元素的方法在frozenset中都没有。

>>> f_set = frozenset('python')
>>> f_set
frozenset({'t', 'h', 'y', 'n', 'p', 'o'})
>>> f_set.add(3)    # 不能增加元素
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'

集合运算

         元素与集合的关系:元素与集合只有一种关系,元素要么属于某个集合,要么不属于。

>>> set1 = set('python')
>>> set1
{'t', 'h', 'y', 'n', 'p', 'o'}
>>> 't' in set1    # 元素属于集合
True
>>> 'm' not in set1    # 元素不属于集合
True

  集合与集合的关系:假设有两个集合A和B。

                  A是否等于B,即两个集合的元素是否完全一样。

>>> A = set('python')
>>> B = set('python')
>>> A == B    # 判断A和B是否相等
True
>>> A != B
False

    A是否是B的子集,或B是否是A的超集。

>>> A = set('python')
>>> A
{'t', 'h', 'y', 'n', 'p', 'o'}
>>> B = set('python23')
>>> B
{'2', 't', 'h', 'y', '3', 'n', 'p', 'o'}
>>> A < B    # 判断A是否是B的子集
True
>>> A.issubset(B)    # 判断A是否是B的子集
True
>>> B > A    # 判断B是否是A的超集
True
>>> B.issuperset(A)    # 判断B是否是A的超集
True

    A和B的并集。这个结果是生成一个新的对象,原有的集合没有改变。

>>> A = set('pyt')
>>> B = set('hon2')
>>> A | B    # A和B的并集
{'2', 't', 'h', 'n', 'y', 'p', 'o'}
>>> A.union(B)    # A和B的并集
{'2', 't', 'h', 'n', 'y', 'p', 'o'}
>>> A    # 原有的集合没有改变
{'t', 'y', 'p'}
>>> B
{'2', 'h', 'n', 'o'}

    A和B的交集。这个结果是生成一个新的对象,原有的集合没有改变。

>>> A = {1, 'e', 'f', 'd'}
>>> B = {1, 'w', 'f'}
>>> A & B    # A和B的交集
{1, 'f'}
>>> A.intersection(B)    # A和B的交集
{1, 'f'}
>>> A    # 原有的集合没有改变
{1, 'e', 'd', 'f'}
>>> B
{1, 'w', 'f'}

    A相对于B的差(补)。即A相对于B的不同的部分元素。也是生成一个新的对象,原有的集合没有改变。

>>> A = {1, 'e', 'f', 'd'}
>>> B = {1, 'w', 'f'}
>>> A – B    # A相对于B的差(补)集
{'e', 'd'}
>>> A.difference(B)    # A相对于B的差(补)集
{'e', 'd'}
>>> A    # 原有的集合没有改变
{1, 'e', 'd', 'f'}
>>> B
{1, 'w', 'f'}

A和B的对称差集。即A相对于B的不同的部分元素和B相对于A的不同的部分元素的并集。

>>> A = {1, 'e', 'f', 'd'}
>>> B = {1, 'w', 'f'}
>>> A – B    # A相对于B的不同的部分元素
{'e', 'd'}
>>> B – A    # B相对于A的不同的部分元素
{'w'}
>>> A.symmetric_difference(B)    # A和B的对称差集
{'e', 'w', 'd'}

  

 

 

 

>= {1, 'e', 'f', 'd'}

>>> B = {1, 'w', 'f'}

>>> A – B    # A相对于B的差(补)集

{'e', 'd'}

>>> A.difference(B)    # A相对于B的差(补)集

{'e', 'd'}

>>> A    # 原有的集合没有改变

{1, 'e', 'd', 'f'}

>>> B

{1, 'w', 'f'}