集合#

视频

集合的元素必须是不可变对象,且元素间有互异性。分为两类:

它们的区别主要在于是否可变,以及写法上面。

set 的定义可以为:

set('Hello') # 写法 1
{'H', 'e', 'l', 'o'}
{'H', 'e', 'l', 'o'} # 写法 2
{'H', 'e', 'l', 'o'}

frozenset 的定义:

frozenset('Hello')
frozenset({'H', 'e', 'l', 'o'})

下面先以 set 为例 Python 如何操作集合的。

基本操作#

  • 支持 add() 方法,添加元素

s = set(['Python','is','a','magic','language'])
s
{'Python', 'a', 'is', 'language', 'magic'}
s.add('!')
s
{'!', 'Python', 'a', 'is', 'language', 'magic'}
s = {5, 7, 3, 2, 9, 35, 5, 34, 5, 7}
s # 自动去重
{2, 3, 5, 7, 9, 34, 35}
min(s)
2
max(s)
35
len(s)
7
  • 支持更新(update()

a = set([1, 2, 3, 4])
b = set([3, 4, 5, 6])
a.update(b)
a
{1, 2, 3, 4, 5, 6}
  • 方法 remove() 删除集合中元素

s = set('hello')
s
{'e', 'h', 'l', 'o'}
s.remove('h')
s
{'e', 'l', 'o'}
  • remove() 元素不存在,则会引发错误;而 discard() 则不会。

s.remove('om')
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[14], line 1
----> 1 s.remove('om')

KeyError: 'om'
s.discard('om')
s
{'e', 'l', 'o'}

相等与不相等#

set('Python') == set('python')
False
set('Python') != set('python')
True

子集 与 超集#

<<=>>= 用来判断前面一个集合是否是后面一个集合的严格子集,子集,严格超集,超集。

set('Hello') < set('HelloWorld')
True
set('Hello') <= set('Hello')
True
set('Hello') < set('Hello')
False

并集(\(\bigcup\))使用 |#

set('Hello') | set('world')
{'H', 'd', 'e', 'l', 'o', 'r', 'w'}

交集(\(\bigcap\))使用 &#

set('Hello') & set('world')
{'l', 'o'}

差集(\(-\))使用 -#

set('Hello') - set('world')
{'H', 'e'}

对称差使用 ^#

set([1,2,3,4]) ^ set([3,4,5,6])
{1, 2, 5, 6}

可变与不可变#

a = set((2, 3))

a.remove(2)
a
{3}
a = frozenset((2, 3))

a.remove(2)
a
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[27], line 3
      1 a = frozenset((2, 3))
----> 3 a.remove(2)
      4 a

AttributeError: 'frozenset' object has no attribute 'remove'

集合的特性#

  • 如是可变集合(set)与不可变集合(frozenset)进行运算,得到的新集合的类型与左操作数相同。

  • 对于可变集合(set)可以进行就地修改,支持操作符:|=&=-=^=

  • 集合只能包含不可变的(即可散列的)对象类型。

a = set('Hello')
a |= set('Python')
a
{'H', 'P', 'e', 'h', 'l', 'n', 'o', 't', 'y'}
a = set('Hello')
a &= set('Python')
a
{'o'}
a = set('Hello')
a -= set('Python')
a
{'H', 'e', 'l'}
a = set('Hello')
a ^= set('Python')
a
{'H', 'P', 'e', 'h', 'l', 'n', 't', 'y'}
b = set('Hello') | frozenset('Python')
b
{'H', 'P', 'e', 'h', 'l', 'n', 'o', 't', 'y'}
c = frozenset('Python') | set('Hello')
c
frozenset({'H', 'P', 'e', 'h', 'l', 'n', 'o', 't', 'y'})