IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 5.【Python编程】集合Set相关知识及基本操作 -> 正文阅读

[数据结构与算法]5.【Python编程】集合Set相关知识及基本操作

5.【Python编程】集合Set相关知识及基本操作

备注: 本教程主要使用Python3.6在jupyter notebook上编程实现。Python环境配置参考《【Python学习】Windows10开始你的Anaconda安装与Python环境管理》或者《【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理》

5.1 集合的创建

集合(set)是一个无序的不重复元素序列。可以使用大括号{ }或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{ },因为{ }是用来创建一个空字典。此外,集合中的元素必须是不可变类型
python3版本,对于数据量很小的集合并且数字很少的时候,确实是做了一个排序,但集合的本质还是无序的!
Python内置的集合set中元素顺序是按元素的哈希值进行存储的,并不是按先后顺序。

set1 = {"北京","上海","广州","深圳","成都"}
print(set1)
set2 = set()
print(set2)
list1 = [1,1,1,2,2,3,4,5,6,7,8,8,9,10]
set3 = set(list1)  # 集合具有去重功能
print(set3)
{'成都', '深圳', '上海', '广州', '北京'}
set()
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
# 集合的元素是按元素的哈希值进行存储的
set4 = set([9,4,1,6,100,101,119,222,333,301,1000,1301,200])
print(set4)

set4_2 = set([9,4,1,6,100,101,119,222,333,301,1000,1301,200])
print(set4_2)

set5 = set([4,9,1,6,222,101,119,100,333,301,1000,1301,200])
print(set5)
{1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
{1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
{1, 4, 101, 6, 100, 1000, 9, 200, 333, 301, 1301, 119, 222}

5.2 集合的常见操作

  • 集合推导式
# 找出字符串'我是中国人,中国人不骗中国人'中存在而字符串'我是谁'中不存在的所有元素
set1 = {x for x in '我是中国人,中国人不骗中国人' if x not in '我是谁'} # 与列表推导式的区别是使用了“{}”
print(set1)
{',', '国', '中', '骗', '不', '人'}
  • 计算集合的元素个数
empty_set = set()
print("len(empty_set)=", len(empty_set))
set1 = {1,3,5,7,9}
print("len(set1)=", len(set1))
len(empty_set)= 0
len(set1)= 5
  • 清空集合
set1 = {1,3,5,7,9}
print(set1)
set1.clear()
print("执行set1.clear()之后...")
print(set1) # set()表示空集
{1, 3, 5, 7, 9}
执行set1.clear()之后...
set()
  • 集合增加元素
A = {1,2,3,4,5,6}
print(A)
A.add(1)
print(A)
A.add(7)
print(A)
{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6, 7}

A.update(x)可以添加元素,且参数可以是列表,元组,字典

A = {1,2,3,4,5,6}
A.update([1,3],[8,9]) # 列表
print(A)
A.update((11,12,13)) # 元组
print(A)
A.update({15,16,17}) # 集合
print(A)
A.update({18:19,20:21}) # 字典
print(A) # 字典的键会被添加到集合当中
{1, 2, 3, 4, 5, 6, 8, 9}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 20}
  • 移除集合当中的元素
A = {1,2,3,4,5,6}
A.remove(1)
#A.remove(7) # 元素必须在集合当中,否则会报错如下:
'''
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-26-d5cf803bb5a2> in <module>
      1 A = {1,2,3,4,5,6}
      2 A.remove(1)
----> 3 A.remove(7) # 元素必须在集合当中,否则会报错如下:
KeyError: 7
'''
print(A)
A.discard(2) # # 元素不一定需要在集合当中
A.discard(8)
print(A)
{2, 3, 4, 5, 6}
{3, 4, 5, 6}

集合里只有0~31范围内的数字,执行.pop()删除时, 删掉的是最小的数字, 其余数字升序排列
实际上,.pop执行的是删除实际存储在集合当中最前面的元素

set1 = {9,31,4,1,6,21,8,3,11,0,21,24,25,29} #,99,21,35,33,34}
print("set1:",set1) # 自动按从小到大排序
set1.pop() 
print("set1:",set1)
set1.pop()
print("set1:",set1)
set1.pop()
print("set1:",set1)

set2 = {9,4,1,6,100,101,119,222,333,301,1000,1301,200}
print("set2:",set2) # 自动按从小到大排序
set2.pop() # 移除1
print("set2:",set2)
set2.pop() # 移除100
print("set2:",set2)
set2.pop() # 移除4
print("set2:",set2)

set3= set('我是中国人')
print("set3:",set3)
set3.pop()
print("set3:",set3)
set3.pop()
print("set3:",set3)
set3.pop()
print("set3:",set3)
set1: {0, 1, 3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {1, 3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set2: {1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set3: {'国', '中', '是', '我', '人'}
set3: {'中', '是', '我', '人'}
set3: {'是', '我', '人'}
set3: {'我', '人'}

5.3 集合的基本运算

set()list()的区别

# 利用set的特性,计算字符串有多少个不同的字符
sentence_set = set('我是中国人,中国人不骗中国人')
print(sentence_set)
print('句子中的不同字符个数:',len(sentence_set))
# 利用list把句子转化为字组成的列表,BERT、GPT模型常用的NLP处理操作
sentence_list = list('我是中国人,中国人不骗中国人')
print(sentence_list)
print('句子的长度:',len(sentence_list))
{'我', ',', '国', '骗', '是', '人', '中', '不'}
8
['我', '是', '中', '国', '人', ',', '中', '国', '人', '不', '骗', '中', '国', '人']

两个集合的基本运算

  • 并集:集合A或者集合B中存在的元素
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的并集:",A | B)
C = A.union(B) # C=A+B,union: 联合
print("集合A与B的并集:", C)
集合A与B的并集: {1, 2, 3, 4, 5, 6}
集合A与B的并集: {1, 2, 3, 4, 5, 6}
  • 交集:集合A与集合B中都存在的元素
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的交集:",A & B)
D = A.intersection(B) # D=A+B,intersection: 交叉
print("集合A与B的交集:", D)
集合A与B的交集: {3, 4}
集合A与B的交集: {3, 4}
  • 补集/差集:集合A中存在而集合B中不存在的元素
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的差运算:",A - B)
E = A.difference(B) # E=A-B
print("集合A与B的差运算",E)
集合A与B的差运算: {1, 2}
集合A与B的差运算 {1, 2}
  • A^B= (A-(A&B))|(B-(A&B))
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B中不同时存在的元素:",A ^ B)
F = A.symmetric_difference(B)
print("集合A与B中不同时存在的元素:",F)
print("集合A与B中不同时存在的元素:",(A-(A&B))|(B-(A&B)))
集合A与B中不同时存在的元素: {1, 2, 5, 6}
集合A与B中不同时存在的元素: {1, 2, 5, 6}
集合A与B中不同时存在的元素: {1, 2, 5, 6}

5.4 元素与集合的关系

A = {1,2,3,4,5,6,7}
print(1 in A)
print(8 in A)
True
False
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:16:53  更:2022-01-08 14:17:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:42:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码