1.1 集合

是一种可迭代的,无序的,不能包含重复元素的数据结构。集合的元素是不可变的,如:int, float, string ,tuple等,可变的内容不可以是集合的元素,如:list, dict, set等。

集合可分为:

  • 可变集合(set)
  • 不可变集合(frozenset)

1.2 可变集合

1.2.1 创建集合

>>> a = {1,3,2,4}
>>> a
{1, 2, 3, 4}

用大{}表示,注意:字典也用{}表示,但里面存放的是键值对。

>>> a = set()  # 创建空集合,如果 a={} 是空字典
>>> a
set()

用set函数创建集合,里面跟上一个序列:

>>> a = set("hello")
>>> a
{'e', 'o', 'h', 'l'}

1.2.2 修改可变集合

  • 添加元素: add(elem)
    注意:不能添加重复元素,因为集合元素不重复。
>>> a = set()
>>> a = {1,2,3,4}
>>> a.add(5)
>>> a
{1, 2, 3, 4, 5}
>>> a.add(4)
>>> a
{1, 2, 3, 4, 5}
  • 删除元素:remove(elem); discard(elem)
    两种元素的区别是:删除不存在的元素前才抛出异常,后者不会。
>>> a = {1,2,3,4}
>>> a.remove(1)
>>> a
{2, 3, 4}
>>> a.discard(4)
>>> a
{2, 3}
>>> a.remove(4)  # 4不存在,抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 4
  • 删除任意一个元素,返回值是删除的元素:pop()
>>> a = {1,3,2,4}
>>> a.pop()
1
  • 清空集合: clear()
>>> a = {1,2,3,4}
>>> a.clear()
>>> a
set()

1.2.3 其它方法

  • 复制一个集合: copy()
>>> a = {1,2,3,4}
>>> b = a.copy()
>>> b
{1, 2, 3, 4}
  • 两个集合空交集返回真: isdisjoint()
>>> a = {1,2,3,4}
>>> b = {1,2}
>>> a.isdisjoint(b)  # 有交集返回False
False
  • 是子集返回真: issubset()
>>> a = {1,2,3,4}
>>> b = {1,2,3,4,5}
>>> a.issubset(b)
True
>>> b.issubset(a)
False
  • 是超集返回真: issuperset()
>>> a = {1,2,3,4,5}
>>> b = {1,2}
>>> c = {1,2,6}
>>> a.issuperset(b)
True
>>> a.issuperset(c)
False
  • 合并集合到集合A:update()
>>> a = {1,2,3,4}
>>> a.update({3,4,5,6})
>>> a
{1, 2, 3, 4, 5, 6}

1.2.4 集合的运算

运算符

说明

&

交集:获取两个集合都存在的元素

|

并集:两个集合元素合并在一起,去掉重复的。

-

差集:属于集合A,但不属于集合B的

^

对称差集:只属于集合A,集合B,即去掉交集剩下的。

==

相等

!=

不相等

in

在里面

not in

不在里面

  • 交集:intersection; intersection_update
>>> a = {1,2,3,4}
>>> b = {1,2}
>>> a & b
{1, 2}
>>> a.intersection(b)
{1, 2}

# intersection_update会修改集合A,而前者生成新的集合
>>> a = {1,2,3,4}
>>> b = {3,4,5,6}
>>> a.intersection_update(b)
>>> a
{3, 4}
  • 并集:union
>>> a = {1,2,3,4}
>>> b = {5,6}
>>> a | b
{1, 2, 3, 4, 5, 6}
>>> a.union(b)
{1, 2, 3, 4, 5, 6}
  • 差集:difference;difference_update()
>>> a = {1,2,3,4}
>>> b = {1,2}
>>> a - b
{3, 4}
>>> a.difference()
{1, 2, 3, 4}
>>> b - a  # 反过来减,去掉之后没有元素了。
set()

# difference_update 会修改集合A
>>> a = {1,2,3,4}
>>> b = {3,4,5,6}
>>> a - b
{1, 2}
>>> a  # 没变
{1, 2, 3, 4}
>>> a.difference_update(b)
>>> a  # 变了
{1, 2}
  • 对称差集:symmetric_difference(); symmetric_difference_update()
>>> a = {1,2,3,4}
>>> b = {3,4,5,6}
>>> a ^ b
{1, 2, 5, 6}
>>> a.symmetric_difference(b)
{1, 2, 5, 6}

# symmetric_difference_update 修改集合A

1.2.5 通用函数

函数

说明

enumerate()

给元素编号,返回一个enumerate对象

len()

长度

max()

最大值

min()

最小值

sorted()

排序,生成新列表

sum()

求和

>>> a = {'a','b','c','hello'}
>>> a
{'a', 'b', 'hello', 'c'}
>>> for i in enumerate(a):
...     print(i)
...
(0, 'a')
(1, 'b')
(2, 'hello')
(3, 'c')

1.3 不可变集合 frozenset

称为冻结集合,不可更改,但可以访问和集合运算。

不可变集合可以做为字典的键,可以做为集合的元素。

# 创建
>>> a = frozenset(["张三","李四","hello",1,2,3])
>>> a
frozenset({1, 2, 3, 'hello', '张三', '李四'})
>>> type(a)
<class 'frozenset'>

1.4 集合推导式

同列表推导式

# [item for item in iterable]
# [item for item in iterable if condition]

>>> a = {i for i in range(10)}
>>> a
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}