前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【taro react】---- 编译微信小程序后报错:Error: Minified React error #321;
1. 错误图片 2. 报错场景 taro 3.2.12 react 编译成微信小程序,微信开发者工具打开编译后的项目报错! 3. 解决办法 删除 node_modules 文件夹 重新安装,执行 yarn 4. 结果 解决报错!
Rattenking
2022/05/27
1K0
【taro react】---- 编译微信小程序后报错:Error: Minified React error #321;
Taro——安装和使用
Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vue/Nerv 等框架来开发 微信 / 京东 / 百度 / 支付宝 / 字节跳动 / QQ 小程序 / H5 / RN 等应用。
思索
2024/08/15
2010
Taro——安装和使用
React报错之组件不能作为JSX组件使用
原文链接:https://bobbyhadz.com/blog/react-cannot-be-used-as-a-jsx-component[1]
chuckQu
2022/08/19
2.6K0
【taro react】---- H5 通过 Jenkins 实现自动化部署
1. 配置项目描述 2. git地址和凭证配置 3. 发布分支配置 4. 编译配置 1. 编译命令 npm run build:h5 2. 编译配置 5. 发布配置 将编译后的文件复制到服务器启动项目对应的项目路径下!保存配置! 6. 测试配置 1. 立即构建 2. 控制台输出 3. 部署完成
Rattenking
2022/08/26
5450
【taro react】---- H5 通过 Jenkins 实现自动化部署
「Taro开发」前端多端开发,Taro观赏指南
最近接到多端开发,因为老项目使用的React,考虑到迁移成本,选择了Taro,迁移成本相对较低,且上手较快。
叶一一
2022/10/24
2.3K0
【taro react 错误解决】---- Uncaught SyntaxError: Unexpected token ‘<‘
1. 报错提示 Uncaught SyntaxError: Unexpected token '<' 2. 报错截图 3. 查看报错原因 4. 分析原因 这里肯定不可能是错误的,依次向下查找; head 标签里边的 meta title script 等都是常规,没有多余的 ‘<’,没有报错; body 标签中 script 的 app.js 的静态资源文件路径错误! 5. 造成问题的原因 app.js 是脚手架自动引入,也就是说不是代码的问题,而是配置问题; 查看 config 下的
Rattenking
2022/01/06
3.9K0
【taro react 错误解决】---- Uncaught SyntaxError: Unexpected token ‘<‘
HUE简介及编译
Hue是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera贡献给开源社区,它是基于Python Web框架Django实现的。通过使用Hue我们可以在浏览器端的Web控制台上与Hadoop集群进行交互来分析处理数据,例如操作HDFS上的数据,运行MapReduce Job等等。很早以前就听说过Hue的便利与强大,一直没能亲自尝试使用,下面先通过官网给出的特性,通过翻译原文简单了解一下Hue所支持的功能特性集合:
create17
2019/03/12
4.1K0
【taro react】---- h5跳转后生命周期多次执行
1. 问题场景 从上图可以看到,进入页面同一个接口执行了两次【当然这个次数不是固定的,会出现三次也会出现一次】,检查了页面代码,只在onShow生命周期请求了一次接口! 2. 问题原因
Rattenking
2022/05/09
3720
【taro react】---- h5跳转后生命周期多次执行
0858-7.1.6-安装YARN Queue Manager服务启动异常分析
在CDP7.1.6的添加组件过程中,添加YARN Queue Manager后,启动服务过程中,提示启动Yarn Queue Manager Store角色失败。如下图:
Fayson
2021/07/28
1.2K0
ReferenceError: React is not defined 报错解决方法
issues 详情:https://github.com/facebook/create-react-app/issues/9882
小鑫
2022/04/26
5.4K0
多端统一开发-Taro的安装与使用
Taro是一套遵循React语法规则的多端开发解决方案。目前市面上已经有各式各样的小程序、h5和安卓、ios端,如何解决一次开发,多端运行已经成为开发者目前迫切需要解决的难题。而使用 Taro,我们可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信/百度/支付宝/字节跳动小程序、H5、React-Native 等)运行的代码。
我的小熊不见了丶
2019/05/22
7540
关于airtest群控制ios
在 targets 下的类别中,依次将 Build Settings 里的 Validate Workspace 修改为 Yes
小小咸鱼YwY
2022/12/18
1.2K3
一个 create-react-app v5 的问题
前两天我准备用 create-react-app 创建一个新项目,然后我在命令行下执行
狂奔滴小马
2022/03/30
1.3K0
【Techo Day 腾讯技术开放日】jira React 实战
说明: 这里使用脚手架安装项目的时候遇到了一个问题,大致可能说的是 node 版本不匹配,也就是我的版本低了,截图如下。
yaoyaoah
2022/10/31
4720
H5页面卡顿加载慢原因分析
H5页面卡顿原因分析: 1.动画太多:渲染重绘占用GPU 2.页面操作导致重绘频繁 3.页面元素复杂:资源类标签太多(图像/视频/dom树太长) 4.内置webview性能太差 5.和3类似,iOS出现的,和native交互是,创建嵌套iFrame 解决办法:按照对应原因解决即可 H5加载太慢问题分析: 1.请求location时的中转太多 2.返回的资源太大,导致分次传输 3.Dom里的资源太多 解决办法:CDN,GZIP合并压缩等
江一铭
2022/06/16
2.5K0
H5与原生混合开发总结
本文主要针对H5与原生混合开发中的交互问题进行讨论,当然,这仅仅是鄙人的见解,求同存异。
江一铭
2022/06/17
1.6K0
H5与原生混合开发总结
ServelessDay 2021用户反馈
这是一个合成大西瓜的游戏demo,语言是Python3.6版本,可以通过这个模板,快速部署上线这个游戏。
喵喵侠
2021/05/25
1.2K0
Echarts报错-Uncaught ReferenceError: echarts is not defined
造成这个错误的原因:导入js的位置不对,要在使用时导入,option前一点导入,不能导入太前了。
王小婷
2025/05/18
1090
Echarts报错-Uncaught ReferenceError: echarts is not defined
React报错之Invalid hook call
导致"Invalid hook call. Hooks can only be called inside the body of a function component"错误的有多种原因:
chuckQu
2022/09/20
2.7K0
React报错之Invalid hook call
SQL审核 | SQLE 二次开发环境搭建
就职于捷信消费金融有限公司,担任 DBA 工作。先后从事过 oracle 、mongo 、mysql 的 DBA ,以及大数据 ETL 的开发工作。对 NEWSQL 以及云原生分布式数据库具有浓厚的兴趣爱好。
爱可生开源社区
2022/04/06
1.1K0
SQL审核 |  SQLE 二次开发环境搭建
推荐阅读
相关推荐
【taro react】---- 编译微信小程序后报错:Error: Minified React error #321;
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验