集合中的方法:利用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'}