Python数据结构:集合(set)


集合

集合的定义

集合是一个可变的无序的不能包含重复元素的容器。可以把集合看成是由字典的键构成的一个容器,集合中的元素是唯一的、无序的和不可变的。

集合的创建

1.使用大括号{}创建非空集合,示例如下:

>>> s = {
    
    1,2,3,4,5}
>>> print(s)
{
    
    1,2,3,4,5}
>>> print(type(s))
<class 'set'>
>>> s = {
    
    [1, 2, 3, 1, 2]} # 列表为可变类型,不能当作集合的元素,会报错
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    s = {
    
    [1, 2, 3, 1, 2]}
TypeError: unhashable type: 'list'

注意:空的大括号只能用于创建字典。

2.使用set()函数可以把其他类型转换为集合,并且去掉其中的重复值,示例如下:

>>> s = set([1, 1, 2, 2, 3, 4, 8, 8]) # 将列表转化为集合
>>> print(s)
{
    
    1, 2, 3, 4, 8}
>>> print(type(s))
<class 'set'>

>>> s = set('python') # 将字符串转化为集合
>>> print(s)
{
    
    'n', 'h', 'p', 'y', 't', 'o'} # 集合是无序的,每次输出元素的位置都有可能不同
>>> print(type(s))
<class 'set'>

>>> s = set() # 使用set()函数创建空集合
>>> print(s)
set() # 空集合
>>> print(type(s))
<class 'set'>

set()函数参数为可迭代对象,如字符串、列表、元组等;当无参数时,创建一个空集合,空集合用set()表示,而非{}。集合是一个可变对象,可以对集合中的元素进行添加、删除,但是集合是无序的,不能位置进行索引切片获取元素,同时也没有键值对的结构,不能使用键去获取值,因此,集合中的元素是无法被获取和修改的。

集合元素添加

集合提供了一些方法可以对其中的元素进行添加,下面介绍这些常用的添加方法:

1.add()函数添加单个元素,语法如下:

set.add(obj)

参数:

  • obj --需要添加的元素

返回值:无返回值

将元素obj添加到集合中,如果元素已存在,则不进行任何操作。示例如下:

>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.add('a') # 只能添加一个元素
{
    
    1, 2, 3, 4, 'a', 8}

2.update()函数添加多个元素,语法如下:

set.update(seq)

参数:

  • seq – 需要添加的元素,参数可以给多个用逗号间隔,可以是列表,元组,字典等

返回值:无返回值

示例如下:

# 添加字符串
>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.update('python') 
>>> print(s)
{
    
    1, 2, 3, 4, 'y', 8, 'h', 't', 'o', 'p', 'n'}

# 添加列表
>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.update([7,9,12],[10,15,20]) 
>>> print(s)
{
    
    1, 2, 3, 4, 7, 8, 9, 10, 12, 15, 20}

# 添加元组
>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.update((7,9,12,10,15,20))
>>> print(s)
{
    
    1, 2, 3, 4, 7, 8, 9, 10, 12, 15, 20}

# 添加字典
>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.update({
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}) # 添加字典的键
>>> print(s)
{
    
    1, 2, 3, 4, 'name', 8, 'grade', 'age'}

集合元素删除

集合提供了几种删除元素的方法:

1.remove()函数删除,语法如下:

set.remove(x)

参数:

  • x --需要删除的元素,如果元素不存在,则会发生错误。

返回值:无返回值。

示例代码如下:

>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.remove(3) # 删除元素3
>>> print(s)
{
    
    1, 2, 4, 8}

>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.remove('a') # 删除集合内不存在的元素时报错
>>> print(s)
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    print(s.remove('a'))
KeyError: 'a'

2.discard()函数删除,语法如下:

set.discard(x)

参数:

  • x --需要删除的元素,如果元素不存在,不会发生错误。

返回值:无返回值。

示例代码如下:

>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.discard(4) # 删除元素3
>>> print(s)
{
    
    1, 2, 3, 8}

>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.remove('a') # 删除集合内不存在的元素时不会报错
>>> print(s)
{
    
    1, 2, 3, 4, 8}

3.pop()函数随机删除集合中的一个元素,语法如下:

set.pop()

无参数,返回值被随机删除的元素,集合是无序的,pop()会删除集合左面第一个元素。

示例如下:

>>> s = {
    
    1, 2, 3, 4, 8}
>>> print(s.pop())
1 # 多次执行,被删除的值都不一样

4.clear()函数清空集合,语法如下:

set.clear()

无参数,无返回值。示例如下:

>>> s = {
    
    1, 2, 3, 4, 8}
>>> s.clear() # 清空列表
>>> print(s) # 空集合
set()

集合的函数

集合中还提供了一些方法,下面介绍一些常用方法:

1.拷贝集合

copy()方法方法用于拷贝一个集合,语法如下:

set.copy()

无参数,返回值拷贝集合的副本,示例如下:

>>> s = {
    
    1, 2, 3, 4, 8}
>>> print(s.copy()) 
{
    
    1, 2, 3, 4, 8}

2.判断两个集合是否包含相同的元素

isdisjoint() 用于判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False,语法如下:

set.isdisjoint(set)

参数:

  • set – 必需,用于比较的集合

返回值:布尔值,如果不包含返回 True,否则返回 False。

示例如下:

>>> s1 = {
    
    1, 2, 3, 4, 8}
>>> s2 = {
    
    3, 4, 5, 7, 10}
>>> print(s1.isdisjoint(s2)) # 两个集合有共同的元素,返回False
False

集合的运算

集合支持数学理论中的各种集合运算,不仅可以通过运算符号实现,集合还提供了函数来实现集合运算,对应关系如下表:

方法 符号 描述
x.difference(y) x - y x和y的差集
x.intersection(y) x & y x和y的交集
x.union(y) x | y x和y的并集
x.issubset(y) x < y x是y的子集
x.issuperset(y) x > y x是y的超集
x.symmetric_difference(y) x^y x和y的对称差

示例如下:

>>> s1 = {
    
    1, 2, 3, 4, 5}
>>> s2 = {
    
    4, 5, 6, 7, 8}

# 差集
>>> print(s1.difference(s2))
{
    
    1, 2, 3}
>>> print(s1 - s2)
{
    
    1, 2, 3}

# 交集
>>> print(s1.intersection(s2))
{
    
    4, 5}
>>> print(s1 & s2)
{
    
    4, 5}

# 并集
>>> print(s1.union(s2))
{
    
    1, 2, 3, 4, 5, 6, 7, 8}
>>> print(s1 | s2)
{
    
    1, 2, 3, 4, 5, 6, 7, 8}

# 子集
>>> print(s1.issubset(s2))
False
>>> print(s1 < s2)
False

# 超集
>>> print(s1.issuperset(s2))
False
>>> print(s1 > s2)
False

# 对称差
>>> print(s1.symmetric_difference(s2))
{
    
    1, 2, 3, 6, 7, 8}
>>> print(s1 ^ s2)
{
    
    1, 2, 3, 6, 7, 8}

猜你喜欢

转载自blog.csdn.net/shield911/article/details/124111146