【数据结构实践】从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}


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

目录
相关文章
|
25天前
|
机器学习/深度学习 算法 数据挖掘
线性回归模型的原理、实现及应用,特别是在 Python 中的实践
本文深入探讨了线性回归模型的原理、实现及应用,特别是在 Python 中的实践。线性回归假设因变量与自变量间存在线性关系,通过建立线性方程预测未知数据。文章介绍了模型的基本原理、实现步骤、Python 常用库(如 Scikit-learn 和 Statsmodels)、参数解释、优缺点及扩展应用,强调了其在数据分析中的重要性和局限性。
53 3
|
9天前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
53 15
|
9天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
30 5
|
16天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
36 7
|
15天前
|
存储 缓存 Python
Python中的装饰器深度解析与实践
在Python的世界里,装饰器如同一位神秘的魔法师,它拥有改变函数行为的能力。本文将揭开装饰器的神秘面纱,通过直观的代码示例,引导你理解其工作原理,并掌握如何在实际项目中灵活运用这一强大的工具。从基础到进阶,我们将一起探索装饰器的魅力所在。
|
18天前
|
开发者 Python
Python中的装饰器:从入门到实践
本文将深入探讨Python的装饰器,这一强大工具允许开发者在不修改现有函数代码的情况下增加额外的功能。我们将通过实例学习如何创建和应用装饰器,并探索它们背后的原理和高级用法。
34 5
|
29天前
|
机器学习/深度学习 人工智能 数据可视化
使用Python进行数据可视化:探索与实践
在数字时代的浪潮中,数据可视化成为了沟通复杂信息和洞察数据背后故事的重要工具。本文将引导读者通过Python这一强大的编程语言,利用其丰富的库函数,轻松入门并掌握数据可视化的基础技能。我们将从简单的图表创建开始,逐步深入到交互式图表的制作,最终实现复杂数据的动态呈现。无论你是数据分析新手,还是希望提升报告吸引力的专业人士,这篇文章都将是你的理想指南。
39 9
|
24天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
24天前
|
设计模式 缓存 开发者
Python中的装饰器:从入门到实践####
本文深入探讨了Python中强大的元编程工具——装饰器,它能够以简洁优雅的方式扩展函数或方法的功能。通过具体实例和逐步解析,文章不仅介绍了装饰器的基本原理、常见用法及高级应用,还揭示了其背后的设计理念与实现机制,旨在帮助读者从理论到实战全面掌握这一技术,提升代码的可读性、可维护性和复用性。 ####
|
27天前
|
存储 开发者 Python
Python 编程基础:从入门到实践
本文旨在通过深入浅出的方式,向初学者介绍 Python 编程语言的基础概念和实践应用。我们将从 Python 的基本语法开始,逐步过渡到函数、模块的使用,最后以实际项目案例结束,帮助读者构建起完整的编程知识体系。
39 3
下一篇
DataWorks