【数据结构实践】从0到1带你利用Python实现自定义集合

简介: 集合(简称集)是数学中一个基本概念,我们应该都比较熟悉,不管是生活中,还是数学上,我们都频繁地接触到。集合在数学领域具有无可比拟的特殊重要性。一定范围的,确定的,可以区别的事物,当作一个整体来看待,就叫做集合,简称集,其中各事物叫做集合的元素或简称元。如(1)阿Q正传中出现的不同汉字(2)全体英文大写字母。任何集合是它自身的子集。它是集合论的研究对象,集合论的基本理论直到19世纪才被创立。集合论的基础是由德国数学家康托尔在19世纪70年代奠定的,经过一大批卓越的科学家半个世纪的努力,到20世纪20年代已确立了其在现代数学理论体系中的基础地位,可以说,现代数学各个分支的几乎所有成果都构筑在严格的

前言


集合(简称集)是数学中一个基本概念,我们应该都比较熟悉,不管是生活中,还是数学上,我们都频繁地接触到。集合在数学领域具有无可比拟的特殊重要性。一定范围的,确定的,可以区别的事物,当作一个整体来看待,就叫做集合,简称集,其中各事物叫做集合的元素或简称元。如(1)阿Q正传中出现的不同汉字(2)全体英文大写字母。任何集合是它自身的子集。它是集合论的研究对象,集合论的基本理论直到19世纪才被创立。集合论的基础是由德国数学家康托尔在19世纪70年代奠定的,经过一大批卓越的科学家半个世纪的努力,到20世纪20年代已确立了其在现代数学理论体系中的基础地位,可以说,现代数学各个分支的几乎所有成果都构筑在严格的集合理论上。集合具有确定性、互异性、无序性、纯粹性和完备性等性质


最简单的说法,即是在最原始的集合论--朴素集合论中的定义,集合就是"一堆东西"。集合里的"东西",叫作元素。若x是集合A的元素,则记作x∈A。集合是把人们的直观的或思维中的某些确定的能够区分的对象汇合在一起,使之成为一个整体(或称为单体),这一整体就是集合。组成一集合的那些对象称为这一集合的元素(或简称为元)。现代数学还用"公理"来规定集合。


不但在数学上能够频繁接触到集合的知识,学习过java的童鞋应该非常熟悉这一概念,java的集合类型中有List,Set,Map。List是有序可重复的;Set是无序,不可重复的;Map是键值对,键值唯一,值可重复。可以看出Set更符合我们今天所说的数学上的集合。在数学上,把由不同元素组成的容器叫做集合,而Python引入了这一概念,集合对象是一组无序的可哈希的值,在Python中集合有两种不同的类型,即可变集合和不可变集合,可变集合可以像列表一样删除和添加元素,对于不可变集合来说,则不允许这样做。本文将从集合的定义和常见的操作来展开介绍


集合的定义


集合的定义主要有以下几点:

  • 集合是无序的,所以不支持用下标索引来查找元素。
  • 集合中的每一个元素都是唯一的
  • 集合是一种可变的数据类型


集合的常见操作


最常见的操作就是添加元素和删除元素:

1.向集合中添加元素

  1. add():将添加的元素作为一个整体处理.
  2. update():将添加的元素拆分,作为个体传入集合中.


2.删除集合的元素

  1. remove():删除集合中的具体的值,如果集合中没有这个值,则程序报错.
  2. pop():随机删除集合中的某个元素,如果集合为空,则程序报错.
  3. discard():如果元素存在,直接删除,如果元素不存在,程序不会报错,不做任何操作
  4. clear():集合清空,集合为空


集合的运算


集合的运算主要有交集、并集和差集:

  • 1) 交集:含有既属于A又属于B的元素,没有其他元素的集合。使用操作符“&”执行交集操作,也可使用intersection( )方法完成。
  • 2) 并集:包含一组集合的所有元素,而不包含其他元素构成的集合。使用操作符“|”执行并集操作,同样也可使用union( )方法完成。
  • 3) 差集:所有属于A且不属于B的元素构成的集合。使用操作符“一”执行差集操作,同样也可使用difference( )方法完成。


主体设计


使用Python自定义可变集合,实现创建集合、添加或删除元素,以及求交集、并集、差集等一系列运算,步骤如下:

  1. 创建自定义Person类。
  2. 使用_ hash_ 哈希算法, 把形参转为-一个数值, 再用_ eq _把转换过来的数值进行比较。
  3. 使用_ repr_ 自定 义类,实现自我描述的功能。
  4. 定义两个集合,实现添加、删除数据。
  5. 实现集合的运算并输出。

网络异常,图片无法展示
|


编程实现


创建Person类

classPerson:
def__init__(self, name, idCard):
self.name=nameself.idCard=idCard#使用__hash__算法,把形参转为一个hash值,然后使用__eq__把转换过来的哈希值进行比较def__hash__(self):
returnself.name.__hash__()
def__eq__(self, other):
ifself.idCard==other.idCard:
returnTruereturnFalse#定义集合格式def__repr__(self):
returnself.name+':'+self.idCard


调用Person自定义集合


p1=Person('zs','1231')
p2=Person('李四','1231')
p3=Person('zs','1232')
p4=Person('王五','1233')
p5=Person('赵六','1233')
p6=Person('赵六','1234')
p7=Person('赵六','1234')
x1= {p1,p2,p3,p4,p5,p6,p7}
myset=set(x1)
print("集合x为:", myset)


输出结果:


集合x为: {王五:1233, zs:1231, 赵六:1233, 赵六:1234, zs:1232, 李四:1231}

当name和idCard相同时,表示同一个元素,因为集合是唯一的只会保留一个


对集合进行增删操作

其实增删操作还可以自定义,这里使用的set自带的方法

p8=Person('鲁班','1237')
p9=Person('韩信','1238')
myset.add(p8)
myset.add(p9)
print('新增元素之后的集合为:', myset)


新增执行结果:

原集合为: {zs:1231, zs:1232, 王五:1233, 赵六:1233, 李四:1231, 赵六:1234}
新增元素之后的集合为: {韩信:1238, zs:1231, zs:1232, 王五:1233, 赵六:1233, 李四:1231, 鲁班:1237, 赵六:1234}


删除操作代码如下:

myset.remove(p4)
print('删除p4元素之后的集合为:', myset)

执行结果如下:这里会把'王五:1233'对应的元素删除

删除p4元素之后的集合为: {zs:1231, zs:1232, 鲁班:1237, 韩信:1238, 李四:1231, 赵六:1234, 赵六:1233}


集合的运算实现


接着上面的代码进行操作

新建集合2

# 新建一个集合x2= {p8,p9,p10,p11}
set2=set(x2)
print('集合2为:', set2)


执行结果:集合1是删除元素之前的集合

集合1为: {李四:1231, 王五:1233, zs:1231, 鲁班:1237, 赵六:1233, 韩信:1238, zs:1232, 赵六:1234}
集合2为: {李白:1544, 刘备:1534, 鲁班:1237, 韩信:1238}


集合运算:

并集

print('集合1和集合2的并集为:', myset|set2)

执行结果:

网络异常,图片无法展示
|


交集

print('集合1和集合2的交集为:', myset&set2)

执行结果:

集合1和集合2的交集为: {鲁班:1237, 韩信:1238}


差集

print('集合1和集合2的差集为:', myset-set2)


执行结果:

集合1和集合2的差集为: {赵六:1234, 王五:1233, zs:1231, 李四:1231, zs:1232, 赵六:1233}


集合的运算就跟四则运算一样简单.

目录
相关文章
|
19天前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
132 47
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
21天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
134 77
|
21天前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
56 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
6天前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
23 10
|
21天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
40 12
|
21天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
39 10
|
21天前
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
40 10
|
21天前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
44 10
|
Python
Python中引入自定义路径下的用户自定义类
自定义类如下: import math class Circle: # Construct a circle object def __init__(self, radius = 1): self.
801 0
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!

热门文章

最新文章