返回顶部
首页 > 资讯 > 后端开发 > Python >python set()去重的底层原理及实例
  • 635
分享到

python set()去重的底层原理及实例

2024-04-02 19:04:59 635人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录set是什么?set特点一、set去重简单实例二、重新set实现机制三、结论四、应用场景需求set是什么? 数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被

set是什么?

数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素(set elements)。python把这个概念引入到它的集合类型对象里。集合对象是一组无序排列的可哈希的值。集合关系测试和uNIOn、intersection等操作符在Python里也同样如我们所预想地那样工作。

set特点

集合的元素有三个特征:

1.确定性:集合中的元素必须是确定的;

2.互异性:集合中的元素互不相同,如:集合A={1,a},则a不能等于1);

3.无序性:集合中的元素没有先后之分,如:{3,4,5}和{3,5,4}算作同一个集合。

python中集合(set)是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素,还可以计算交集、差集、并集等,它与列表(list)的行为类似,区别在于set不同包括重复的值,而且set元素是无序的。

在python中可以用大括号 {} 创建集合。注意:如果要创建或初始化一个空集合,你必须用 set() 而不是 {} 。因为后者{} 作为创建一个空的字典,以后我们会介绍字典这种数据结构

一、set去重简单实例

ls = [1,2,3,1,2]
print(set(ls))

我们知道对于一个列表最简单的去重方法就是直接调用set函数,利用集合元素的唯一性,就可以做到去重。但是,这个底层原理究竟是什么样的却一直半解。

且看下面剖析

二、重新set实现机制


class Foo:
    def __init__(self,name,count):
        self.name = name
        self.count = count
    def __hash__(self):
        print("%s调用了哈希方法"%self.name)
        return hash(id(self))
    def __eq__(self, other):
        print("%s调用了eq方法")
        if self.__dict__ == other.__dict__:
            return True
        else:return False
f1 = Foo('f1',1)
f2 = Foo('f2',2)
f3 = Foo('f3',3)
ls = [f1,f2,f3]
print(set(ls))

从上面可以看出,set方法就是去调用hash方法,然后根据哈希值一不一样就行去重判断,但是事实就是样吗?且看下面程序。


class Foo:
    def __init__(self,name,count):
        self.name = name
        self.count = count
    def __hash__(self):
        print("%s调用了哈希方法"%self.name)
        return hash(self.count)
    def __eq__(self, other):
        print("%s调用了eq方法"%self.name)
        return self.__dict__ == other.__dict__
f1 = Foo('f1',1)
f2 = Foo('f2',1)
f3 = Foo('f3',3)
ls = [f1,f2,f3]
print(set(ls))

我看可以看出,实际上f1,f3的哈希值是相等的,但是set并没有这么简单就判断f1,f3是重复的,而是进一步通过eq方法判断这两个值是否相等,只有相等时才会认为这两个之间实际上是同一个。为了验证上面的说法,我们来看看下面的代码。

f1 = Foo('f1',1)
f2 = Foo('f1',1)
f3 = Foo('f3',3)
ls = [f1,f2,f3]
print(set(ls))

可以看出去重后,只有两个元素,所以上面说法得证。

三、结论

set的去重是通过两个函数__hash__和__eq__结合实现的。
1、当两个变量的哈希值不相同时,就认为这两个变量是不同的
2、当两个变量哈希值一样时,调用__eq__方法,当返回值为True时认为这两个变量是同一个,应该去除一个。返回FALSE时,不去重

四、应用场景需求

有一个公司,现有100个员工,由于数据库不完善,使用时间比较长,里面有很多重复数据需要清除。具体需求如下:

每个员工的属性有:姓名,性别,年龄,部门。 由于年龄和部门都会发生变化,所以现在认为只要两个员工之间姓名和性别一样,就认为是同一个人。

请实现员工去重:

class Staff:
    def __init__(self,name,gender,age,department):
        self.name = name
        self.gender = gender
        self.age  = age
        self.department = department
    def __hash__(self):
        return hash(self.name+self.gender)
    def __eq__(self, other):
        return True
ls = ['zs','ls','ww','zq']
gender_list = ['man','femal']
staff_list = []
for i in range(100):
    staff_list.append(Staff(ls[i%4],gender_list[i%2],i,'class'))
print(set(staff_list))
print([(i.name,i.gender) for i in set(staff_list)])

到此这篇关于python set()去重的底层原理的文章就介绍到这了,更多相关python set()去重内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python set()去重的底层原理及实例

本文链接: https://lsjlt.com/news/161916.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python set()去重的底层原理及实例
    目录set是什么?set特点一、set去重简单实例二、重新set实现机制三、结论四、应用场景需求set是什么? 数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被...
    99+
    2024-04-02
  • Go底层channel实现原理及示例详解
    目录概念:使用场景:底层数据结构:操作:创建发送接收关闭案例分析:概念: Go中的channel 是一个队列,遵循先进先出的原则,负责协程之间的通信(Go 语言提倡不要通过共享内存来...
    99+
    2024-04-02
  • Spring AOP底层原理及代理模式实例分析
    这篇文章主要介绍“Spring AOP底层原理及代理模式实例分析”,在日常操作中,相信很多人在Spring AOP底层原理及代理模式实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
    99+
    2023-06-30
  • Go WaitGroup及Cond底层实现原理
    目录WaitGroup概念底层数据结构使用方法Cond概念底层数据结构使用方法WaitGroup 概念 Go标准库提供了WaitGroup原语, 可以用它来等待一批 Goroutin...
    99+
    2024-04-02
  • Spring Boot底层原理实例分析
    这篇“Spring Boot底层原理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-06-29
  • 【C++】多态的实现及其底层原理
    个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 文章目录 前言一、什么是多态?二、多态的构成条件2.1什么是虚函数?2.2虚函数的重...
    99+
    2023-08-17
    c++ 开发语言 多态
  • spring aop底层原理及如何实现
    目录前言 使用 源码分析 总结 前言 相信每天工作都要用spring框架的大家一定使用过spring aop,aop的概念是面向切面编程,相对与传统的面向对象编程oop,aop更关...
    99+
    2024-04-02
  • spring aop底层原理及实现方法
    这篇文章主要介绍spring aop底层原理及实现方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用要分析spring aop的底层原理,首先要会使用,先创建一个普通maven webapp项目,引入spring...
    99+
    2023-06-14
  • Javasynchronized底层的实现原理
    目录监视器底层实现执行流程总结前言: 想了解 synchronized 是如何运行的?就要先搞清楚 synchronized 是如何实现? synchronized 同步锁是通过 J...
    99+
    2024-04-02
  • HashMap的底层实现原理
    这篇文章主要介绍“HashMap的底层实现原理”,在日常操作中,相信很多人在HashMap的底层实现原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HashMap的底层实现原理”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-04
  • 关于Python字典的底层实现原理
    目录字典是否是有序字典的查询、添加、删除的时间复杂度字典的实现原理Python3.6之前的无序字典带入具体的数值来介绍Python3.7+后的新的实现方式Python3.7+带入数据...
    99+
    2023-02-10
    Python字典 字典底层实现原理 Python字典实现原理
  • Java中Set集合的使用和底层原理解析
    目录Set系列集合介绍Set集合概述HashSet无序原理Set集合对象去重LinkedHashSetTreeSet排序规则Set系列集合介绍 Set集合概述 Set系列集合特点: ...
    99+
    2022-12-10
    Java中Set集合的使用 Java中Set集合
  • Golang底层原理解析String使用实例
    目录引言String底层stringStruct结构引言 本人因为种种原因(说来听听),放弃大学学的java,走上了golang这条路,本着干一行爱一行的情怀,做开发嘛,不能只会使用...
    99+
    2024-04-02
  • Java synchronized底层实现原理以及锁优化
    目录一、概述synchronized简介synchronized作用synchronized的使用二、实现原理三、理解Java对象头四、JVM对synchronized的锁优化1、偏...
    99+
    2024-04-02
  • python pow函数的底层实现原理介绍
    一、最朴素的方法和pow比较 python中求两个a的b次方,常见的方法有:pow(a,b),a**b。那么这两个是否有区别,而且他们底层是怎么实现的呢? 最容易想到的方法就是:循环...
    99+
    2024-04-02
  • python GIL锁的底层原理是什么
    本篇内容介绍了“python GIL锁的底层原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!释放GIL锁原理分析在单核CPU下,这种...
    99+
    2023-06-30
  • C++中string底层原理的示例分析
    小编给大家分享一下C++中string底层原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、深浅拷贝浅拷贝:在实现string时要是不实先strin...
    99+
    2023-06-25
  • Synchronized的底层实现原理是什么
    Synchronized的底层实现原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1)给静态方法加锁public&n...
    99+
    2024-04-02
  • chatgpt底层实现的原理是什么
    chatgpt底层实现的原理是通过人工的标注方式来训练出一种强化学习的冷启动模型和reward反馈模型,然后再通过强化学习的模式来学...
    99+
    2023-02-09
    chatgpt
  • HashMap的底层实现原理是什么
    这篇文章给大家介绍HashMap的底层实现原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.HashMap的常用方法//  Hashmap存值:----------------------...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作