前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据类型第2篇「字典和集合的原理和应用」

数据类型第2篇「字典和集合的原理和应用」

作者头像
清菡
发布于 2021-01-04 06:34:47
发布于 2021-01-04 06:34:47
1.1K00
代码可运行
举报
文章被收录于专栏:清菡软件测试清菡软件测试
运行总次数:0
代码可运行

作者:清菡 博客:oschina、云+社区、知乎等各大平台都有。

由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送!

目录

  • 一、集合
    • 1.定义个有元素的集合
    • 2.自动去重
    • 3.集合常用的五个方法
  • 二、集合和字典都是无序的
  • 三 、字典和集合都是无序的,在内存中是怎么存储?
    • 1.为什么说字典和集合是无序的?
    • 2.字典查找值的过程
    • 3.Python 里基础数据类型分为三大类
    • 4.为什么会出现散列冲突?
  • 四、可变和不可变元素:可哈希和不可哈希
    • 1.可变类型的数据不可进行哈希运算,不可变的数据类型可进行哈希运算
    • 2.集合为什么无序?
    • 3.散列类型为什么是无序的?
  • 五、性能分析

本篇文章:重点掌握集合的用法即可。

字典,大家都用得特别多,花括号包起来的,一个键一个值构成一个元素。集合和字典的表达形式是一样的。

字典和集合在 Python 中都是使用花括号进行表示的。

一、集合

1.定义个有元素的集合

set1 = {1,2,3}

集合和字典相比,集合里面只有值,没有键。

2.自动去重

集合有个比较强大的功能:自动去重。 里面不会存在重复的元素,集合最常见的应用就是对列表去重。

2.1 把字典转换成集合,再转换回字典,它会真去重
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set1 = {1,2,3,3,3,4,4,4,4,4}
print(set1)

打印出来是集合,重复的元素自动过滤掉了。定义的时候,不管定义多少个重复元素,都自动过滤掉了。

2.2 用集合对列表去重
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
li = [1,1,1,2,2,2,3,3,3] # 利用集合对列表去重
li2 = list(set(li))
print(li2)

首先把列表转换成一个集合,自动把里面的重复元素给去除掉了,再转换回列表。

集合在 Python 中是用得比较少的数据类型。

3.集合常用的五个方法

add()

添加元素

update()

更新元素

remove()

删除元素

clear()

清空里面所有的元素

copy()

复制元素

集合,它里面的元素是无序的。可以修改,集合是可变类型的数据。

3.1 空集合中怎么添加元素?

add()方法,每次可以往里面添加一个数据进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
se = set()  # 空集合
# 集合添加数据
se.add('qinghan') # 一次只能添加一个,所以只添加了一个qinghan
print(se)
3.2 删除用 remove()

集合可以添加也可以删除。删除用remove(),传入对应的元素就可以进行删除。

集合还可以做交集、并集这样的操作,这个对我们用处不大。

3.3update() 更新元素

跟字典的update()一样的。它是将一个集合更新到这个集合里面,可以往里面一次加入多个元素。

通过这个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
se = set()  # 空集合
se.update({111,22,33,44})
print(se)

可以一次更新进去多个元素。

update的源码:

接收的是不定量参数,可以传一个也可以传多个。

可以往里面加元组、列表、字符串,但是一般用的时候选择用集合,将一个集合更新到原来的集合里面。

3.4clear()清空元素

还有个常用的方法:clear()清空里面所有的元素。

3.5 copy()复制元素

copy() # 做一个复制的

二、集合和字典都是无序的

Python 里面把它称作散列类型。

Python 更新到 3.7 之后,字典出现一个新的特性:3.7 之前的字典是无序的。3.7 之后字典中元素的顺序,它会按你依次添加的顺序进行保存。现在字典,里面的元素实际上是有序的。

官方文档已声明:

三 、字典和集合都是无序的,在内存中是怎么存储?

dict 与 set 实现原理是一样的,都是将实际的值放到 list 中。

唯一不同的在于 hash 函数操作的对象,对于 dict,hash 函数操作的是其 key,而对于 set 是直接操作的它的元素。

假设操作内容为 x,其作为因变量,放入 hash 函数,通过运算后取 list 的余数,转化为一个 list 的下标,此下标位置对于 set 而言用来放其本身。

而对于 dict 则是创建了两个 list,一个 list 该下表放此 key,另一个 list 中该下标对应的 value。

其中,我们把实现 set 的方式叫做 Hash Set,实现 dict 的方式叫做 Hash Map/Table(注:map 指的是通过 Key 来寻找 value 的过程)。

1.为什么说字典和集合是无序的?

1.1 字典和集合底层都是存储在列表里面

一个字典,在存储的时候,会拆分成 2 部分,会存在 2 个列表里面,一个列表存键,一个列表存值:

字典存储时的拆分

1.2 怎么通过 Key 找到对应的 Value 值呢?

字典在存储之前,做了个 Hash 操作:

Hash操作如图,图片来自网络

拿到字典的键,进行哈希操作。通过对应的哈希算法,然后得出一串数字。

拿哈希出来的值除以内存分出来的列表的长度,得到余数。这个余数当成对应元素的下标。把键和值通过下标存在列表中对应的位置。

1.3 散列类型的存储过程

散列类型的存储过程,图片来自网络

散列类型的意思就是无序的。 散列就是哈希。散列内部元素是无序的。

刚开始内存分了 12 个格子存数据,哈希后,第一个元素得出的余数是 6,有 2 个列表,会把键存在对应的列表里面,把值存在对应的 6 的位置。

散列表存储数据很松散,不像列表完整得排过来的。散列表里面是分散存储的,会把对应的键存到一个散列表里面。

查找字典中元素的时候,首先它会拿到你这个键,同样进行哈希运算。运算完毕后得出一个值,然后去散列表里面找对应的键。找到对应的键,然后比较下是不是这个键。

字典哈希的是它的键,不是它的值。集合是哈希的它的值,所以集合里面的值是不可变类型的,不能有可变类型的值。

2.字典查找值的过程

字典查找值的过程

散列值就是哈希值。拿到键名,进行哈希,哈希过后得到散列值。

拿到散列值进行相应的运算,然后拿到表元。表元是在散列表中的一个序号。

2.1 第一种情况

比如序号是 6,看 6 里面存的这个键,跟你刚才输进来查找的那个键是不是一样的。

如果是一样的,键相等,会返回表元里面对应的值,会给你找到你所存储的字典的值。

如果它在这里没找到值的话,这个时候会抛出异常。(也就是字典通过键去找值,没找到的时候就会抛出错误。)

2.2 第二种情况
散列冲突:

每个元素哈希出来的结果是不一样的。如图,第一个元素计算出来是 6,会找到散列表中第 6 个格子。第二个值,运算之后,如果得出来的也是个 6,那么这个时候就会起散列冲突。

解决散列冲突有二种方案:

方案一:

有散列冲突的时候,会对散列表进行扩容,扩容后进行重新排序。

方案二:

在后面再加个列表。这样的话,第一个元素计算出来是 6,会找到散列表中第 6 个格子。

第二个值,运算之后,如果得出来的也是个 6,因为加了一个列表(这个列表可存储多个值),就不会起散列冲突了。

以上是字典,散列类型底层存储。

3.Python 里基础数据类型分为三大类

第一类,数值类型: 1 一个数只有单个元素,像这个 1 就是 1。

第二类,序列类型: 字符串、列表、元组。

第三类,散列类型: 字典、集合。特征:内部元素是无序的。

4.为什么会出现散列冲突?

举个栗子:

这两个数据通过哈希,计算散列值,取余后拿到的余数,如果是一样的话,在储存值的时候,就会造成散列冲突。

通过字典的键去哈希,把哈希值存在散列表里面。通过对应的键,然后找到列表中存储的对应元素的值。

集合相对于列表比较简单一些。集合没有键和值,直接拿到集合里面的值进行哈希操作。

四、可变和不可变元素:可哈希和不可哈希

1.可变类型的数据不可进行哈希运算,不可变的数据类型可进行哈希运算。

集合里面只能存储可哈希的对象。意思是集合里面只能存储不可变的数据类型。

例如:set2 = {1,2,3,[1,2]}

这个集合就报错了:

因为列表是可变类型。可变类型是不能进行哈希运算的。

数值类型、字符串、元组可以,列表、字典、集合不能作为元素储存在这个集合里面。

集合里面的元素通过哈希操作算出对应值,放到散列表里面。

2.集合为什么无序?

因为散列表里面存储元素的时候是没有顺序的,散列表也是会不断变化的(会变化长度、调整元素位置的),所以说散列类型是无序的。

3.散列类型为什么是无序的?

通过哈希算法算了之后,然后存到对应的散列表里面,散列表里面数据存储是没有固定顺序的。

五、性能分析

字典最占用内存,其次是集合。然后是列表、元组。元组是占用内存最少的。但是查找元素的时候,集合是速度最快的,然后是字典。

集合用起来不方便,如果知道哪个元素就好查找,但是不知道那个元素在哪里,就不方便从集合里去取那个元素。字典通过键取值,元组、列表通过下标。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
带你了解NAND NOR FLASH闪存
在正式开始介绍之前,给大家介绍一款非常易用稳定的Flash:CS创世 SD NAND。具备如下特点:
用户11033168
2025/06/27
680
带你了解NAND NOR FLASH闪存
长存被制裁一年后,三星、SK海力士宣布3D NAND将迈入300层!
2022年,美光、SK海力士、三星等相继量产了232层3D NAND Flash,但是在美方的制裁之下,长存128层及以上NAND Flash的供应链受到严重阻碍。在此背景之下,这些国际大厂纷纷加速迈向300层,希望能主导未来3D NAND Flash的技术路线。
芯智讯
2023/09/07
5510
长存被制裁一年后,三星、SK海力士宣布3D NAND将迈入300层!
长江存储“亮剑”:在美起诉美光侵犯其8项3D NAND专利!
11月11日消息,芯智讯通过美国加州北区地方法院最新公布的信息了解到,中国3D NAND闪存制造商——长江存储科技有限责任公司(以下简称“长江存储”)已于11月9日在美国加州北区地方法院对美国美光科技公司(MICRON)和美光消费类产品事业部(MICRON CONSUMER PRODUCTS GROUP, LLC)(以下统称“美光”)提起诉讼,指控美光侵犯了其8项与3D NAND相关的美国专利。
芯智讯
2023/11/16
2800
长江存储“亮剑”:在美起诉美光侵犯其8项3D NAND专利!
铠侠计划在2031年量产1000层3D NAND!
4月6日消息,据外媒Xtech Nikkei报道,日本存储芯片大厂铠侠(Kioxia)首席技术官(CTO)Hidefumi Miyajima表示,该公司计划到2031年批量生产超过1000层的3D NAND Flash芯片。
芯智讯
2024/04/11
1200
铠侠计划在2031年量产1000层3D NAND!
NAND刻蚀设备市场的垄断将被打破?
随着摩尔定律的逐步失效,数字逻辑芯片和DRAM芯片随着制程工艺提升所带来的密度优势正在降低,成本却在高速提升。相比之下,NAND Flash闪存的情况却并非如此。与半导体行业的其他行业不同,NAND每年的成本都在大幅下降。
芯智讯
2023/08/09
3600
NAND刻蚀设备市场的垄断将被打破?
【半导体存储】关于NAND Flash的一些小知识
作为一名电子专业的学生,半导体存储显然是绕不过去的一个坎,今天聊一聊关于Nand Flash的一些小知识。
用户11033168
2024/12/17
3770
【半导体存储】关于NAND Flash的一些小知识
3D NAND原厂技术比拼,哪家垂直单元效率更高?
近日市场研究机构Techinsights对于三星、SK海力士/Solidigm、美光、KIOXIA/WD、YMTC的200层以上的3D NAND Flash进行了对比分析,发现三星的垂直单元效率 (VCE,vertical cell efficiency) 是最高的。
芯智讯
2024/06/18
3300
3D NAND原厂技术比拼,哪家垂直单元效率更高?
SKhynix:4D-NAND技术进展(2023)
SK海力士半导体(SK Hynix)[1]成立于1983年,是韩国的一家全球领先的半导体制造商。其前身为现代电子产业株式会社,经过多次重要的重组和收购,最终在2001年从现代集团分离出来,并更名为海力士半导体。公司在1996年正式在韩国上市,并于1999年收购了LG半导体,进一步扩大了其业务范围。
数据存储前沿技术
2025/02/11
2080
SKhynix:4D-NAND技术进展(2023)
从闪存卡到SSD硬盘,存储芯片是如何发展起来的?
DRAM属于易失性存储器,也就是大家常说的内存。今天,我们再来看看半导体存储的另一个重要领域,也就是非易失性存储器(也就是大家熟悉的闪存卡、U盘、SSD硬盘等)。
鲜枣课堂
2022/12/30
1.3K0
从闪存卡到SSD硬盘,存储芯片是如何发展起来的?
KIOXIA:SSD 风云二十载
QSBC错误校正技术(Quadruple Swing-By Code)是KIOXIA(原东芝存储)开发的一种专有错误校正技术,用于提升企业级和数据中心SSD的可靠性和数据完整性。以下是对QSBC技术的介绍:
数据存储前沿技术
2025/02/11
1190
KIOXIA:SSD 风云二十载
超越铠侠,目标三星!SK海力士90亿美元收购英特尔NAND闪存业务
出售边缘业务,更有利于英特尔集中精力应对NVIDIA、高通和AMD带来的一系列挑战。
镁客网
2020/11/06
7360
超越铠侠,目标三星!SK海力士90亿美元收购英特尔NAND闪存业务
SK海力士发布321层4D NAND Flash闪存样品,性能提升59%!
虽然美国存储芯片大厂美光在2022年下半年宣称全球首家量产了232层NAND Flash,但事实上,长江存储在美光之前就已经小批量量产了。随后在去年11月7日,三星电子也宣布量产了236层3D NAND闪存芯片。今年6月8日,SK海力士也宣布其在2022年8月开发完成的238层堆叠的NAND Flash芯片正式开始量产。至此,头部的三大存储厂商的NAND Flash均已经进入了232层或236层。
芯智讯
2023/09/07
2640
SK海力士发布321层4D NAND Flash闪存样品,性能提升59%!
Optane,3D NAND,朋友一生一起走!
英特尔的战略非常清晰:同为新一代存储介质,Optane(傲腾)针对的是热数据,提供其所需要的存储性能;3D NAND(闪存)针对容量型数据存储市场,二者相得益彰。
冬瓜哥
2019/06/10
5830
Optane,3D NAND,朋友一生一起走!
232层3D闪存芯片来了:单片容量2TB,传输速度提高50%
Pine 发自 凹非寺 量子位 | 公众号 QbitAI 232层的3D闪存芯片来了,数据传输速率提高50%,容量可达2TB。 美光继上次抢先推出176层3D NAND后,近日又率先推出全球首款232层NAND。 △图源美光科技 说起来,跟NAND层数较劲这事儿,并不是美光一家在做。 比如美光的老对手三星,相关研究中心也聚焦在层数上:此前,三星曾抢先业界公布了第八代V-NAND的细节,堆栈层数超过200层。 所以这样“堆高高”,究竟能给芯片性能带来多大的提升? 堆栈层数就像盖楼房 层数越高,NAND闪存可
量子位
2022/08/26
5760
232层3D闪存芯片来了:单片容量2TB,传输速度提高50%
SMI:特征模型ML优化NAND数据读取效率
随着数据存储需求的增长,QLC(四层单元)闪存因其高密度和低成本成为发展趋势,但在提升容量的同时也带来了诸如跨温度性能、数据保留等问题,对数据可靠性构成挑战。
数据存储前沿技术
2025/02/11
1320
SMI:特征模型ML优化NAND数据读取效率
关于半导体存储的最强入门科普
我们经常使用的U盘、TF卡、SD卡,还有电脑上使用的DDR内存、SSD硬盘,都属于另外一种存储技术。
鲜枣课堂
2022/12/30
1.1K0
关于半导体存储的最强入门科普
从“徒弟”到“师傅”:探秘英特尔大连工厂,解读存储创新DNA
2019年,150多名英特尔大连存储工厂的工程师风尘仆仆地赶赴美国新墨西哥州。他们此行不是去拜师学艺,而是到英特尔该州生产基地协助生产。从2007年开始建厂,成为英特尔众多基地中的“小学徒”,到如今为其他生产基地的“传道授业解惑”,英特尔大连存储工厂只用了十余年就实现了“反向技术输出”。
大数据在线
2020/02/14
1.7K0
从“徒弟”到“师傅”:探秘英特尔大连工厂,解读存储创新DNA
SK Hynix量产首个4D NAND闪存:96层堆栈 速度提升30%
随着64层堆栈3D NAND闪存的大规模量产,全球6大NAND闪存厂商今年都开始转向96层堆栈的新一代3D NAND,几家厂商的技术方案也不太一样,SK Hynix给他们的新闪存起了个4D NAND闪存的名字。
Debian中国
2018/12/21
3970
傲腾会是NAND的接班人么?
作为第一个大规模商用的、最有希望接续NAND的下一代存储介质,最近这两三年Intel在傲腾上的投入不可谓不大。Intel甚至在2020年10月宣布出售NAND业务产品线。Intel如此有把握和决心,让我不得不感觉NAND在PLC之后的路,会非常艰难。
冬瓜哥
2021/07/22
5580
90亿美元!英特尔割舍起家业务,大连工厂也要卖掉?
路透社消息,英特尔公司已经同意将其 NAND 存储芯片业务以90亿美元的现金交易出售给 SK 海力士。这将推动这家韩国芯片制造商在全球排名中更上一层楼。
新智元
2020/10/29
1.1K0
推荐阅读
相关推荐
带你了解NAND NOR FLASH闪存
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验