8-Python基础编程之数据类型操作——字典和集合

Python基础编程之数据类型操作——字典和集合

  • 字典
    • 概念
    • 定义
    • 意义
    • 操作
      • 遍历
      • 计算和判定
  • 集合
    • 概念
    • 定义
      • 可变集合
      • 不可变集合
    • 操作
      • 单一集合操作
      • 集合之间操作
        • 交集
        • 并集
        • 差值
        • 判定

字典

概念

无序的,可变的键值对的集合

定义

  1. 方式一直接定义:
person = {"name": "sz", "age": 18}
print(person, type(person))
print(person["name"])
print(person["age"])

输出:
在这里插入图片描述

  1. 利用fromkeys类调用
d = dict.fromkeys("abc",666) # 将该序列的每个元素赋值列表
print(d)

输出:
{‘a’: 666, ‘b’: 666, ‘c’: 666}

注意:key不能重复(重复的话后值会把前值覆盖掉),并且为不可变类型(所谓不可变类型指的是在同一内存下,其不可再次改变)
如:

num =[1,2,3]
print(num, id(num))
num.append(4)
print(num, id(num))

在这里插入图片描述

num=1
print(num, id(num))
num=2
print(num, id(num))

在这里插入图片描述

虽然num和列表都变动了,但num赋值的存储地址变了,而列表其存储地址都是271…224,证明列表为可变;赋值这个是不可变的。

原因:
Python的字典,采用的是哈希(hash)的方式来实现的。
其存储过程为:

  1. 初始化一个表格,用来存放所有的值。这个表格称之为"哈希表,暂且可理解为我们所学的“列表”。
  2. 在存储一个键值对的时候,会作以下操作:根据给定的key,通过某些操作,得到一个在"哈希表"中的索引位置;把key通过"哈希函数"转换成一个整型数字(称为“哈希值”),将该数字对数组长度进行取余,取余结果就当作数组的下标;如果产生了"哈希冲突",比如,两个不同的key,计算出来的索引是同一个则采用”开发寻址法",通过探测函数查找下一个空位。
    再根据索引位置,存储给定的"值”。

其单查找过程为:
再次使用哈希函数将key转换为对应的列表的索引,并定位到列表的位置获取value。

意义

可以通过key,访问对应的值,使得这种访问更具意义。
查询效率得到很大提升,可类比为"汉字字典”的使用方式。

操作

# dic[key]=value
d={"name": "ss", "age": 48}
print(d, type(d), id(d))
d["height"]=180 # 新增操作
print(d, id(d)) # 地址位置相同(改的还是之前的对象)

输出:
在这里插入图片描述

# 1. del dic[key] 删除
d={'name': 'ss', 'age': 48, 'height': 180}
del d['name'] # 若没有对应的关键词则报错
print(d)# 2. dic.pop(key[,default]) 删除指定键值对,并返回对应值
d={'name': 'ss', 'age': 48, 'height': 180}
v=d.pop("age")
print(v,d)
v1=d.pop('age1', 66) # 若key不存在,则返回给定的default值,若没设置该值会报错
print(v1, d)# 3. dic.popitem() 删除按升序排序后的第一个键值对,并以元组的形式返回该键值对
d={'name': 'ss', 'sge': 48, 'a': 18}
re=d.popitem() 
print(re,d) # 发现把a给干掉了# 4. dic.clear() 删除字典内的所有键值对,但保留该字典只是为空了,不同于del是删除了
d={'name': 'ss', 'sge': 48, 'a': 18}
print(d.clear())
print(d)

输出:
在这里插入图片描述

改的是值,不是字典关键字

# 1. dic[key]=value
d={"name": "ss", "age": 48}
d["age"]=180 # 修改操作
d["tall"]=180 # 若不存在是新增
print(d)
# 2. oldDic.update(newDic) 批量修改键值对
d={"name": "ss", "age": 48}
d.update({'age': 666, 'address':'上海'}) # 改一个增一个
print(d)

输出:
在这里插入图片描述

  1. 获取单个值
# 1. dic[key]
d={"name": "ss", "age": 48}
print(d['age'])
# 2. dic.get(key[,default])
d={'name': 'ss', 'age': 666, 'address': '上海'}
v=d.get('name')
v1=d.get(0,666) # 若key不存在则返回设定值
print(v,v1,d)
# 3. dic.setdefault(key[,default])
d={'name': 'ss', 'age': 666, 'address': '上海'}
v=d.setdefault('age1',555) # 跟get差不多,但区别于若key不存在,此操作会对原字典进行添加
print(v,d)

输出:
在这里插入图片描述

  1. 获取多个
# 1. 获取所有的值
d={'name': 'ss', 'age': 666, 'address': '上海'}
print(d.values())
# 2. 获取所有的键
print(d.keys())
# 3. 获取所有键值对
print(d.items())
# 注意:他还是不支持索引,他的类型为view objects

输出:
在这里插入图片描述

遍历

# 1. 先遍历所有keys,然后根据key获取对应的值
d={'name': 'ss', 'age': 666, 'address': '上海'}
keys=d.keys()
for key in keys:print(key, d[key])# 2. 直接遍历所有的键值对
kvs=d.items() # 获取所有键值对
for t in kvs:print(t)k, v = t # 解包print(k,v)

输出:
在这里插入图片描述

计算和判定

d={'name': 'ss', 'age': 666, 'address': '上海'}
print(len(d)) # 计算键值对个数
print('name' in d) # 判定的是key

输出:
在这里插入图片描述

集合

概念

无序的,不可随机访问的,不可重复的元素集合
与数学中集合的概念类似,可对其进行交、并、差、补等逻运算
分为可变集合和非可变集合:set 为可变集合(增删改);frozenset 为不可变集合(创建好之后无法增删改)

定义

可变集合

s = {1,2,3,4}
s = set(iterable) # 转化为集合
s = set(x for x in range(1,10)) # 集合推导式

iterable可以是字符串、列表、元组、字典等

不可变集合

fs = frozenset(iterable)
s = frozenset(x for x in range(1,10)) # 集合推导式

注意事项:

  1. 创建一个空集合时,需要使用set()或者 frozenset(),不能使用s={},因为会被识别成为字典
  2. 集合中的元素,必须是可哈希的值。指的是如果一个对象在自己的生命周期中有一哈希值(hash value)是不可改变的那么它就是可哈希(hashable)的(可理解为不可变类型)
  3. 如果集合中的元素值出现重复,则会被合并为1个

操作

单一集合操作

# 增
s={1,2,3}
s.add(4)
print(s)

输出:
{1, 2, 3, 4}

# 删
s={1,2,3}
res=s.remove(3) # 会改变集合本身
print(res,s)s={1,2,3}
res2=s.discard(13) # 若集合不存在13,则也不会报错的删除操作
print(res2,s)s={1,2,3}
res3=s.pop() # 删除第一个元素
print(res3,s)s={1,2,3}
res4=s.clear() # 清空集合元素
print(res4,s)

输出:
在这里插入图片描述

因为无法通过索引或key进行查询
所以我们只能进行遍历

  1. for in 遍历
s={1,2,3}
for i in s:print(i)

输出:
1
2
3

  1. 迭代器遍历
s={1,2,3}
# 1.生成迭代器
its=iter(s)
# 2.使用这个迭代器访问
for i in its:print(i)

输出:
1
2
3

对于不可变集合的查询,也是一样的

集合之间操作

交集
# 集合本身不发生改变
# 1.intersection()
s1={1,2,3,4,5}
s2={4,5,6}
result=s1.intersection(s2) # 求两个集合的交集
print(result,type(result))
# 若其中一个为不可变集合(结果取决于最先取交集的是可变还是不可变为准)
s3=frozenset([1,2,3])
result2=s1.intersection(s3) # 结果为可变集合
print(result2,type(result2))
result3=s3.intersection(s1)
print(result3,type(result3)) # 结果为不可变集合
# 2.&
s1={1,2,3,4,5}
s2={4,5,6}
result=s1&s2 # 求两个集合的交集
print(result,type(result))# 集合本身发生改变
s1={1,2,3,4,5}
s2={4,5,6}
result=s1.intersection_update(s2)
print(result,type(result)) # 因为改变的是集合本身所以返回空值
print(s1,s2) # 

输出:
在这里插入图片描述
注意:若字符串的数字则必须是字符串才交集有效,对应的内容+对应的类型相同才算完全相交

s1={1,2,3,4,5}
s2={'1','2','3','4','5'}
print(s1.intersection("123"))
print(s1.intersection(["1","2",'6']))
print(s2.intersection("123"))
print(s2.intersection(["1","2",'6']))

输出:
在这里插入图片描述

并集
# 可变集合
s1={1,2,3}
s2={3,4,5,6}
res=s1.union(s2) # 不改变原集合进行并集
print(res,s1)
res=s1|s2 # 可以使用|
print(res,s1)
res3=s1.update(s2)
print(res3,s1)# 不可变集合
s3=frozenset([1,2,3])
res3=s3|s2
print(res3,s3)

输出:
在这里插入图片描述

差值
# 不修改原对象
s1={1,2,3}
s2={3,4,5,6}
res1=s1.difference(s2)
print(res1,s1)
res2=s1-s2
print(res2,s1)# 修改原对象
res3=s1.difference_update(s2)
print(res3,s1)

输出:
在这里插入图片描述

判定
s1={1,2,3}
s2={3,4,5,6}
s3={1,2}
# 判定isdisjoint()两个集合不相交
print(s1.isdisjoint(s2))
print(s3.isdisjoint(s2))
# issuperset()一个集合完全包含另一个集合
print(s1.issuperset(s2))
print(s1.issuperset(s3))
# issubset()一个集合包含于另一个集合(子集合)
print(s3.issubset(s1))

输出:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541753.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot使用ThreadPoolTaskScheduler轻量级多线程定时任务框架

简介: Spring注解定时任务使用不是很灵活,如果想要灵活的配置定时任务,可以使用xxl-job 或者 quartz等定时任务框架,但是过于繁琐,可能成本较大。所以可以使用ThreadPoolTaskScheduler来灵活处理定时任务 ThreadPoolT…

2024 ICPC ShaanXi Provincial Contest —— C. Seats(个人理解)拓扑+dfs

2024 ICPC ShaanXi Provincial Contest —— C. Seats(个人理解)拓扑dfs 先放个传送门 https://codeforces.com/gym/105257/problem/C ———————————————————————————————————— 思路 可以看到,每一个编…

Vision Based Navigation :针对航天领域的基于视觉导航机器学习应用生成训练数据集

2024-09-18 由欧洲空间局主导,由空客防务与空间公司参与创建Vision Based Navigation , 为空间任务中的基于视觉导航(VBN)机器学习应用生成训练数据集。 目前遇到的困难和挑战 1、数据集的可用性和充分性: 挑战&#x…

BFS 解决多源最短路问题

文章目录 多源BFS542. 01 矩阵题目解析算法原理代码实现 1020. 飞地的数量题目解析算法原理 1765. 地图中的最高点题目解析算法原理代码实现 1162. 地图分析题目解析算法原理代码实现 多源BFS 单源最短路: 一个起点、一个终点 多源最短路: 可以多个起点…

9.安卓逆向-安卓开发基础-安卓四大组件2

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

[云服务器13] 如何正确选择云服务器?

【非广告,仅提供建议,没有强制消费引导】 这期我们不讲搭建教程了,因为我想到前面12篇的教程,有关套餐配置的教程好像都有点敷衍…… 所以这期我们主要来说一说服务器的配置选择和不同配置的应用场景。 网站: 雨云 打开后&…

基于ZigBee的农业大棚信息采集系统设计

过去的农业大棚种植中大多需要依靠经验来实现浇水施肥等工作,无法根据天气的变化做出顺应的改变,也就造成了大棚内种植农作物的产量和质量很难得到保证。伴随着物联网与农业种植的结合,基于ZigBee通信和传感器等技术开发一款能监测大棚内环境…

Linux:路径末尾加/和不加/的区别

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 普通文件操作 首先说明这个问题只会出现在目录和符号链接中,因为如果想要索引普通文件但却在路径末尾加/则会出现错误,如例1所示。 # 例1 zhang…

free源码

文章目录 free源码调试main_arena结构:free_hooktcachetcache的结构free_chunk进入tcache: fastbinunlink 合并top free源码调试 main_arena结构: 整体看一下main_arena的结构: free_hook free_hook,在glibc-2.3…

在 Windows 11 中,可以通过修改注册表来更改系统的自动更新时间设置

regedit 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings FlightSettingsMaxPauseDays 36524

AI少女/HS2甜心选择2 仿崩铁人物卡全合集打包

内含AI少女/甜心选择2 仿崩铁【崩坏 星穹铁道 】角色卡全合集打包共6张 内含:布洛妮娅镜流卡芙卡希儿停云银狼 下载地址: https://www.51888w.com/375.html 部分演示图:

项目第六弹:虚拟机管理模块、路由匹配模块

项目第六弹:虚拟机管理模块、路由匹配模块 一、虚拟机管理模块的设计1.什么是虚拟机?2.借助MySQL来理解一下3.如何整合?【埋下伏笔】 二、RabbitMQ为何要有虚拟机1.从业务角度来讲2.步步探索1.优点2.结合业务适用场景和需求3.发掘真正的原因4…

NoSql数据库Redis知识点

数据库的分类 关系型数据库 ,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL 、 Oracle 、 MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQL 数据库 ,全称为 Not Only SQL &a…

Python学习——【4.1】数据容器:list列表

文章目录 【4.1】数据容器:list列表一、数据容器入门二、数据容器:list 列表(一)列表的定义(二)列表的下标索引(三)列表的常用操作(1)列表的查询功能&#xf…

RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验

1.RAGflow简介 全面优化的 RAG 工作流可以支持从个人应用乃至超大型企业的各类生态系统。大语言模型 LLM 以及向量模型均支持配置。基于多路召回、融合重排序。提供易用的 API,可以轻松集成到各类企业系统。支持丰富的文件类型,包括 Word 文档、PPT、exc…

Vue3入门 - ElementPlus中左侧菜单和Tabs菜单组合联动效果

在Vue3中,ElementPlus是使用比较广泛的UI组件库,提供了丰富的界面元素支持项目开发需求。在后台管理系统中,左侧或顶部的菜单栏通常包含多个子菜单项,通过菜单的展开和收缩功能,用户可以方便地查看或隐藏不需要的菜单项…

数字世界中的浪漫:揭秘会跳动的爱心

在编程的世界里,复杂的技术可以与艺术产生美妙的碰撞。无论是通过代码实现动态效果,还是用算法绘制图案,程序员都可以成为数字艺术的创作者。而今天,我们将通过 Python 的强大 GUI 工具库 Tkinter,用简单的代码生成一颗…

U-Boot顶层Makefile详解

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用,方便进一步记录自己的实践总结。 上一章我们详细的讲解了 uboot 的使用方法,其实就是各种命令的使用,学会 uboot 使用以后就可以尝试移植 uboot 到自己的开发…

linux操作系统的基本命令

1.linux下的文件系统 在linux操作目录下没有像window操作系统下盘符的概念,只有一个根目录/,所有文件目录都在它的下面 linux的目录结构: 在Linux系统中: 文件都从跟目录开始的,用/表示文件名称区分大小写路径都是以/俩进行分隔(windown用\分隔)以.开头的文件为隐藏文件 Li…

鸿蒙开发之ArkUI 界面篇 十七 购物综合案例

layoutWeight:子元素与兄弟元素主轴方向按照权重进行分配,参数是联合类型,数字或者是字符串,在指定的空间占多少份额,数字越大,表示在空间中占用的份额越多,如果父容器的子组件没有别的指定,剩下的空间全部…