无序、不重复、元素只读,Python数据容器之集合

277 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

这是机器未来的第12篇文章

写在前面:

  • • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!

  • • 专栏简介:本专栏的核心就是:快!快!快!2周快速拿下Python,具备项目开发能力,为机器学习和深度学习做准备。

  • • 面向人群:零基础编程爱好者

  • • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待

  • • Python零基础快速入门系列

  • • 快速入门Python数据科学系列

  • • 人工智能开发环境搭建系列

  • • 机器学习系列

  • • 物体检测快速入门系列

  • • 自动驾驶物体检测系列

  • • ......

图片

@[toc]

1. 集合概述

集合(set)是一个无序的不重复元素序列。集合是可变数据类型,但是其元素是不可变数据类型。它是一种存储数据的容器。

2. 集合的定义

集合的定义可以通过set()函数和花括号{}来定义。

2.1 set()函数

首先看一下set函数的定义

图片

从上图中可以看到set函数可以支持参数为空或参数为可迭代对象

  • • 参数为空时, 定义空集合
x = set()
print(x, type(x))

图片

  • • 参数为可迭代对象时
x = set([1, 2, 3, 4, -7])       # 输入参数为列表
print(x, type(x))

图片

x = set((1234, -7))       # 输入参数为元组
print(x, type(x))

图片

x = set({1:25, 2:36, 3:-9, 4:20, -7:89})    # 输入参数为字典:仅取字典的key
print(x, type(x))

图片

x = set({1, 2, 3, 4, -7})   # 输入参数为集合,相当于复制
print(x, type(x))

图片

x1 = {1234, -7}
x2 = set(x1)   # 输入参数为集合,相当于复制-深拷贝
x3 = x1
print(x1, type(x1), id(x1), x2, type(x2), id(x2), x3, type(x3), id(x3))

图片

2.2 花括号{}

  • • 定义空集合只能使用set()函数,因为{}也是字典的符号,数据为空的{}表示空字典。
x = {}
print(x, type(x))

图片

可以看到,type(x)返回的数据类型为dict字典

  • • 含有数据集的集合定义
x = {-1, 3+6j, 'ahc', 1e-5}
print(x, type(x))

图片

2.3 集合的特性

  • • 确定性

集合中的元素是不可变数据类型,例如数值类型、字符串类型、元组类型,而列表、字典、集合不可以是集合的元素, 它们都是可变数据类型。

x = {[1234], 53+6j, 1e12, 'ahdhss'}

图片

x = {{1:662:773:884:99}, 53+6j, 1e12, 'ahdhss'}

图片

# 集合是可变数据类型,但是集合中的元素是不可变数据类型,集合中的元素是可以更改的
x = {{1234}, 53+6j, 1e12, 'ahdhss'

图片

特别注意:集合是可变数据类型,但是集合中的元素是不可变数据类型,集合中的元素是可以更改的

x = {(1, 2, 3, 4), 5, 3+6j, 1e12, 'ahdhss'}
print(x, type(x))

图片

  • • 互异性

集合中的元素是不可重复的,如果添加的值已存在于集合中,则不会添加。

x = {413412}
x

图片

从上图中可以看到,集合定义时存在的两个4和两个1,均只保留一个,且集合元素始终从小到大排列。

根据集合的互斥性,可以用来处理列表或元组去重处理。

xl = [413412]
xs = set(xl)
xl = list(xs)
xl

图片

  • • 无序性

集合中的元素是无序的,无法通过索引访问,只能通过遍历的方式访问。

x = {413412}
x[0]

图片

x = {413412}
for i in x:
    print(i, end=', ')

图片

3. 集合的常用用法

x = {413412}
dir(x)

输出如下:

['__and__''__class__''__contains__''__delattr__''__dir__''__doc__''__eq__''__format__''__ge__''__getattribute__''__gt__''__hash__''__iand__''__init__''__init_subclass__''__ior__''__isub__''__iter__''__ixor__''__le__''__len__''__lt__''__ne__''__new__''__or__''__rand__''__reduce__''__reduce_ex__''__repr__''__ror__''__rsub__''__rxor__''__setattr__''__sizeof__''__str__''__sub__''__subclasshook__''__xor__''add''clear''copy''difference''difference_update''discard''intersection''intersection_update''isdisjoint''issubset''issuperset''pop''remove''symmetric_difference''symmetric_difference_update''union''update']

3.1 添加

集合使用add函数添加元素,注意事项:如果添加的元素在集合中已存在,则不会添加

x = {147}   
x.add(3+9j)     # 添加一个复数到集合中
x

图片

x.add(1)        # 如果添加的元素在集合中已存在,则不会添加
x

图片

3.2 删除

删除元素的方法有4种,pop()、remove()、discard()和clear()

  • • pop()函数

pop()函数可以随机从集合中取出一个元素,取出后该元素将不在集合中。

x = {1473+9j} 
y = x.pop()
print(f"x = {x}, y = {y}")

图片

  • • remove()函数

remove()函数可以指定元素从集合中删除,如果元素不存在则会报错

x = {1473+9j} 
y = x.remove(3+9j)      # 仅仅删除,不返回删除的值
print(f"x = {x}, y = {y}")

图片

元素不存在的场景:

x = {1473+9j} 
y = x.remove(3+8j)      # 仅仅删除,不返回删除的值
print(f"x = {x}, y = {y}")

图片

  • • discard()删除指定元素-不存在不报错
x = {1473+9j} 
y = x.discard(3+8j)      # 不存在不报错
print(f"x = {x}, y = {y}")

图片

  • • clear()清除集合
x = {1473+9j} 
x.clear()
x

图片

3.3 修改

集合不可以使用索引访问,因此如果需要修改,则执行先remove,再add

3.4 读取

x = {413412}
for i in x:
    print(i, end=', ')

图片

3.5 集合运算

图片

  • • 交集

两个集合共同存在的部分,即为交集。

x1 = {1247}
x2 = {47911}
x = x1.intersection(x2)
x

图片

集合x1和集合x2共有的元素是4,7,因此交集为{4, 7}。

使用交集运算符&,也可以达成同样的结果

x1 = {1247}
x2 = {47911}
x = x1 & x2
x

图片

  • • 并集

两个集合的并集就是两个集合中所有的元素组合在一起形成的新的集合,即为并集。

x1 = {1247}
x2 = {47911}
x = x1.union(x2)
x

x1 = {1247}
x2 = {47911}
x = x1 | x2
x

图片

  • • 差集

A,B是两个集合,由所有属于A且不属于B的元素组成的集合,叫做集合A减集合B, 即为集合A对集合B的差集,相应的也有集合B对集合A的差集。

A对B的差集

x1 = {1247}
x2 = {47911}
x = x1.difference(x2)
x

x1 = {1247}
x2 = {47911}
x = x1 - x2
x

图片

B对A的差集

x1 = {1247}
x2 = {47911}
x = x2.difference(x1)  # 或x = x2 - x1
x

图片

  • • 对称差集

集合A与集合B的对称差集定义为集合A与集合B中所有不属于A∩B的元素的集合,记为A△B

x1 = {1247}
x2 = {47911}
x = x1.symmetric_difference(x2)     # 或x = x1 ^ x2
x

图片

3.5 集合推导式

{输出值 for 遍历的元素 in 列表变量 if 条件语句}

与字典的区别

{key:value for 遍历的元素 in 列表变量 if 条件语句}

字典推导式的输出为键值对,集合的输出为值。

x = {413412}
y = {k for k in x if k >= 2}
y

图片

4. 总结

以上就是关于集合的基础用法,欢迎大家讨论交流~

《Python零基础快速入门系列》快速导航:

  • • Python零基础快速入门系列(1) 人工智能序章:开发环境搭建Anaconda+VsCode+JupyterNotebook(零基础启动)

  • • Python零基础快速入门系列(2)一文快速掌握Python基础语法

  • • Python零基础快速入门系列(3)AI数据容器底层核心之Python列表

  • • Python零基础快速入门系列(4)python存储机制:浅拷贝与深拷贝

  • • Python零基础快速入门系列(5)Python只读数据容器之元组

  • • Python零基础快速入门系列(6)Python数据容器之序列:字符串、列表与元组对比

  • • Python零基础快速入门系列(7)Python数据容器之字典

  • • Python零基础快速入门系列(8)Python数据容器之集合

推荐阅读:

图片