文章目录

  • 字典
    • 字典的特点
    • 创建方式
    • 字典元素的访问
    • 字典元素的添加
    • 字典元素的删除
    • 字典的序列解包
      • 序列解包用于列表
      • 序列解包用于元组
      • 序列解包用于字典
    • 表格的构建和打印,列表和字典综合嵌套
    • 字典核心底层原理
      • 把键对象放入字典的底层过程
      • 根据键查找键值对的底层过程
      • 字典底层原理小结
  • 集合
    • 集合的特点
    • 集合的创建
    • 集合的删除
    • 集合的其它操作

字典

字典的特点

无序、可变、键值对
每个元素是一个键值对,包含键对象和值对象
键对象不可以重复(字典是一个依靠键对象的散列值来排列元素的散列表,键对象的散列值不可以重复)

创建方式

a = {'name':'marx','age':18,'salary':'unknown'}
a = dict('name'='marx','age'=18),键值对的元组
a = dict[('name','marx'),('age',18)],键值对元组组成的列表
a = dict(zip(键列表,值列表)),zip()方式也同样适用于元组
a = dict.formkeys(['name','age']),创建值对象为空的字典,注意其中键对象是以列表形式出现,而不是只用逗号隔开

字典元素的访问

a['name'],类似列表和元组中用a[0]的访问方式
a.keys(),列出字典a中所有的键对象
a.items(),列出字典a中所有的键值对
a.values(),列出字典a中所有的值对象
a.get('name'),获取字典a中’name’键对象的值对象
len(a),获取字典a的键值对个数
'name' in anot in,判断键对象是否在字典a中

字典元素的添加

a['address'] = '南天门',如果字典a中没有address这个键,就添加这个键值对;如果有,就更新值对象
a.update(b),b是一个新的字典,将b字典中的内容拷贝到字典a中,重复键就覆盖,没有的键就新增

字典元素的删除

del(a['name']),删除字典a中键对象为name的键值对
a.clear(),清空字典a,字典a变成空字典
a.pop('name'),返回值是name的值对象,抛出name后字典a中就没有这个键值对了
a.popitem('name'),乱序抛出字典a中的键值对,当a为空字典时会抛异常

字典的序列解包

序列解包用于列表

[a,b,c]=[10,20,30]
❓ 去掉方括号好像没有影响

序列解包用于元组

x,y,z = (10,20,30)
(x,y,z) = (10,20,30)
❓ 不太理解列表和元组的序列解包的区别,看起来都是一次性对三个变量赋值

序列解包用于字典

序列解包用于字典默认是对键对象进行操作

a = {'name':'gaoqi','age':18,'job':'programmer'}
m,n,l = a

序列解包对字典中的值对象进行操作
e,f,g = a.values()
序列解包对字典中的键值对进行操作
e,f,g = a.items()

表格的构建和打印,列表和字典综合嵌套

思路:

  1. 构造表格

    1. 字典构建每一行,需要储存数据
    2. 列表装起来每一行,需要按重复格式增殖
  2. 打印
    1. 循环的是行数,也就是列表的元素数
    2. 按字典键对象打印值对象
r1 = {"name":"高小一", "age":18, "salary":30000, "city":"北京"}
r2 = {"name":"高小二", "age":19, "salary":20000, "city":"上海"}
r3 = {"name":"高小五", "age":20, "salary":10000, "city":"深圳"}tb = [r1,r2,r3]#获得第二行的人的薪资
print(tb[1].get('salary'))#打印所有人的薪资
for i in range(len(tb)):print(tb[i].get('salary'))
#打印所有数据
for i in range(len(tb)):print(tb[i].get('name'),tb[i].get('salary'),tb[i].get('city'))

字典核心底层原理

字典的本质是一个散列表,即稀疏数组,即总是有空白元素的数组
散列表中的每个单元叫bucket(表元、桶)
每个bucket有两个部分:键对象的引用、值对象的引用
所有bucket的结构、大小都一样,通过偏移量来读取指定的bucket
字典的键对象:必须可散列,即可以转换出哈希值,字符串、数字、元组皆可

把键对象放入字典的底层过程

  1. 计算键对象的散列值bin(hash('name')

    1. 数组长度假设为8,也就是最小的索引值是7,是最大的3位二进制数,
  2. 取name的散列值最右端的3位,转换为0-7的索引值,假设为6
  3. 索引值为6的bucket是否为空
    1. 为空,将name键对象放入该bucket
    2. 不为空,取name散列值从最右端往左移动3位后的3位数,转换为0-7的索引值…重复步骤2,直到找到空bucket

根据键查找键值对的底层过程

跟上面这个差不多

  1. 算出键对象的散列值x
  2. 从散列值最右取值,转换成序号,找bucket的索引值
  3. 看bucket是否为空
    1. 为空,返回None
    2. 不为空,
      1. 取出该bucket中的键对象,算出该键对象的散列值y
      2. 对比x与y是否相等
        1. 相等,返回该bucket对应的值对象
        2. 不相等,回到步骤2,往左移动3位再找bucket

字典底层原理小结

  • 键对象必须是可以散列的

    • 数字、字符串、元组
    • 自定义对象满足以下条件
      • 支持hash()函数
      • 支持通过__eq__()方法检验相等性
      • 若 a==b为真,则hash(a)==hash(b)也为真
  • 键查询很快
  • 字典是以空间换时间
  • 字典中添加新建可能会导致扩容,导致散列表中键的次序改变,因此不要在遍历字典的同时对字典进行修改

集合

集合的特点

集合的底层就是字典,但只有字典的键对象
集合是无序的、可变的、元素不能重复的(跟字典几乎一样)

集合的创建

a = {'a','b','age'}
a = set(b),将可迭代对象b转换为集合,如果有重复元素就会只留下一个

集合的删除

a.clear(),清空后得到一个空集合a
a.remove(10),删除集合a中的指定元素10

集合的其它操作

就像数学中的集合,并集、交集、差集
并集:a|b, a.union(b)
差集:a-b, a.difference(b)
交集:a&b, a.intersecion(b)

Python基础知识 2022-11-14 ★ 小结 43-50 字典_集合相关推荐

  1. python:python基础语法三,列表、元组、字典、集合

    python基础语法 文章目录 python基础语法 列表(list) 列表简介 切片 列表修改元素 列表的方法 遍历列表 序列(sequence) 序列的基本操作 range()函数 EMS(Emp ...

  2. Python基础(三)列表、元组、字典、集合

    一.序列(sequence) 序列是Python中最基本的一种数据结构. 数据结构指计算机中数据存储的方式. 序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引),并且序列中的数 ...

  3. python 列表 元祖 字典 集合_python基础知识之列表、元祖、字典、集合、字符串。...

    1.可变类型之列表 列表用 [ ]来定义是可变的,可以通过索引值来去查询里面的字段可以可以追加,删除等 ```python names='zhangyang guyun xiangpeng xulia ...

  4. 【Python基础知识-pycharm版】第五节-字典\集合

    第五节-字典\集合\控制语句 字典 字典的创建 字典元素的访问 字典元素添加.修改.删除 序列解包 表格数据使用字典和列表存储,并实现访问 字典核心底层原理(重要) 集合 集合相关操作 字典 字典是& ...

  5. Day2 Python基础学习——字符串、列表、元组、字典、集合

    Python中文学习大本营:http://www.pythondoc.com/ 一.字符串操作 一.用途:名字,性格,地址 name = 'wzs' #name = str('wzs')print(i ...

  6. python基础(09)——列表,元组,字典,集合

    #列表的普通操作 lists = ['张飞','岳飞','双飞'] print(lists[0]) #访问列表的莫个元素lists[0] = '飞飞' #修改列表的某个元素 print(lists)# ...

  7. 第一节课的Python基础知识

    第一节课的Python基础知识 Python内置的数据类型 1.number 2.string 3.list 4.tuple 5.dict 6.set 其他小结 方法range()的使用 获取一个li ...

  8. python基础知识学习笔记(1)

    python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...

  9. Python基础知识笔记

    文章目录 Python基础知识 教程:https://www.liaoxuefeng.com/wiki/1016959663602400 内置函数:https://docs.python.org/3/ ...

  10. 1、Python 基础知识总结

    1.Python 简介 Python 是一门简单易学的,面向对象的,解释型的脚本语言,也是一种开源的.可移植性强的.可扩展性强的高级编程语言,常用于科学计算与人工智能.WEB 开发.金融.云计算等领域 ...

最新文章

  1. nginx学习七 高级数据结构之动态数组ngx_array_t
  2. 每天一道LeetCode-----计算整型数二进制中1的个数/返回二进制翻转后的结果
  3. 散列表查找失败平均查找长度_Python数据结构与算法56:排序与查找:冲突解决方案...
  4. php 字符串的比较大小,php怎么比较两个字符串的大小
  5. UIControl IOS控件编程
  6. Pandas 数据处理三板斧,你会几板?
  7. 关于使用TestDriven.Net 2.0的一点补充
  8. 【财富空间】像先知一样思考,如拳手般战斗
  9. java自由职业者_自由职业者的7个重要技巧
  10. seata之jvm参数解析
  11. Marvell车载交换机88Q5050, 88Q5072 VLAN配置(一)------VLAN的基本原理
  12. 抓取中国天气网当前时段所有城市的天气数据(python+xpath)
  13. skylake服务器处理器M系列,配i系列Skylake处理器!华硕U305评测
  14. (三)兴趣对于工作的重要性
  15. 机器学习:Linear Discriminant Analysis(过程详解+实例代码MATLAB实现
  16. 阿里面试,问了我乐观锁、悲观锁、AQS、sync和Lock,这个回答让我拿了offer
  17. 505 新国王游戏 思维 [代码源][namomo spring camp]每日一题div2
  18. 百度熊掌号基础seo教程之熊掌号运营技巧
  19. uniapp通过uni.addInterceptor实现路由拦截功能
  20. linux 查看系统变量

热门文章

  1. 家用宽带的上传和下载速度
  2. 求生之路2rpg服务器账号跨服,求生之路2官方地图指令大全及地图文件夹位置说明...
  3. 07-白盒测试方法-逻辑覆盖法
  4. 王兄弟跟妹纸分享逆袭秘籍,无关风月!
  5. ArrayMap源码注释
  6. SpringBoot 如何进行限流?老鸟们都这么玩的!
  7. 新款武侠游戏 请名人献声
  8. Mathematics for Computer Science 2
  9. EFI和Legacy启动方式
  10. 3D旋转相册+背景音乐,纯js版本