Python用散列表来实现字典,散列表就是稀疏数组(数组中有空白元素),散列表中的元素叫做表元,字典的每个键值对都占用一个表元,一个表元分成两个部分,一个是对键的应用,另一个是对值的引用,因为表元的大小一致,所以可以通过稀疏数组(散列表)的偏移量读取指定的表元

Python会保证散列表中三分之一的表元都是空的,当向字典中添加元素时,散列表就会用键值对填充表元,当达到剩余三分之一表元是空的时,会将当前的散列表放到一个更大的空间中

当通过key获取字典的value时(求取dict[key]),过程如下:

1.调用hash(key)求取key的散列值。

2.把散列值的低几位当做偏移量,查找散列表里对应的表元。

3.如果表元为空,抛出异常(keyerror),如果表元不为空,会找到一对foundkey:foundvalue。

4.如果foundkey与key相等,返回foundvalue,如果foundkey与key不相等,发生散列冲突,执行第5步。

5.算法在散列值中再取几位,通过新的散列值计算索引,再查找对应的表元,然后执行3和4。

上述过程的流程图如下:

添加元素和更新值的过程和上述流程基本一致,添加元素时,如果发现是空表元,会直接添加值,更新值时,找到对应的表元后,原表元里的值会被更新为新值。

散列冲突并不会总发生,所以字典的速度很快。

因为字典通过key查找value是通过hash函数计算散列值,所以字典的key必须支持hash函数,且通过hash函数计算出的散列值是唯一的,所以key可以使用字符串(str),整型(int),元祖(tuple),但是不能是list

因为散列表是稀疏的,所以字典所占内存极高,典型的空间换时间

因为当向字典中添加键值对时,可能会发生散列冲突,导致键值对的出现在字典中的顺序不同,比如,添加一个key和value,如果没有发生散列冲突,那么该键值对出现在字典中的位置可能靠前,如果发生了散列冲突,就有可能出现在字典中靠后的位置,所以键值对在字典中的位置完全取决于添加顺序

举例

l=[(2,'two'), (1,'one'), (4,'four'), (3,'three')]
d1=dict(l);
print(d1.keys(), d1.items())
d2=dict(sorted(l));#按照key排序
print(d2.keys(),d2.items())
d3=dict(sorted(l, key =lambda x : x[1]))#按照value排序
print(d3.keys(),d3.items())
print(d1==d2==d3)

可见,虽然Python都认为上述三个字典是相等的,但是键值对在字典中的顺序完全不同

因为向字典中添加新的键值对时,有可能导致字典内部的散列表重新分配内存,当把字典中的元素重新添加到新的内存中时,可能导致散列冲突,从而导致键值对在字典中的位置发生变化

这样在循环迭代并同时添加键值对时就有可能跳过一些键

所以,在对已有字典进行循环迭代时,不要同时进行添加操作,而应该先新建一个空字典,将要添加的键值对放在空字典中,然后对原有字典和新字典进行合并

合并字典可用update方法

l1=[(2,'two'), (1,'one'), (4,'four'), (3,'three')]
l2=[(5,'five'), (6,'six'), (7,'seven'), (8,'eight')]
dl1=dict(l1)
dl2=dict(l2)
d=dict()
d.update(dl1)
d.update(dl2)
print(d)

编码就是将文本字符串转化为字节序列,解码就是将字节序列转化为文本字符串,常见的编解码格式有utf8,字节序列计算机识别,文本字符串人类识别

举例

s1='helloworld'
t1=s1.encode('utf8')
print(t1)
s2=t1.decode('utf8')
print(s2)

参考

1.《流畅的Python》

2.  https://blog.csdn.net/jerry_1126/article/details/73017270

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

Python进阶8——字典与散列表,字符串编解码相关推荐

  1. JavaScript数据结构之字典和散列表

    JavaScript数据结构之字典和散列表 集合.字典和散列表可以存储不重复的值.在字典中,我们用[键,值]的形式来存储数据.在散列表中也是一样(也是以[键,值]对的形式来存储数据) 字典 集合表示一 ...

  2. Python进阶7——字典与集合

    1.创建字典的五种方式 d1=dict(one=1, two=2) d2={'one':1, 'two':2} d3=dict(zip(['one', 'two'], [1,2])) d4=dict( ...

  3. 字典:散列表、散列字典、关键字列表、集合与结构体

    字典 散列表和散列字典都实现了Dict的行为.Keyword模块也基本实现了,不同之处在于它支持重复键. Eunm.into可以将一种类型的收集映射转化成另一种. defmodule Sum dode ...

  4. python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  5. Python - 字符串编解码

    文章目录 关于编解码 编码的种类 代码实现编解码 常用字符串--字节转换 字节样式字符串 编解码 url 编解码 字节相加 关于编解码 编码/解码本质上是一种映射 字符a 用 ascii 编码则是65 ...

  6. python 字符串 编码 解码_Python 字符串编解码研究

    Python 2.X 在输入汉字和特殊字符的时候,经常遇到编码解码的问题,究其原因,编译器默认将文件当做ascii编码,因此要正确的实现编解码的转换,需要进行一些设置. 首先让我们来了解几个概念. 文 ...

  7. iconv-lite,JS字符串编解码工具

    编码:字符串到二进制数据转换的过程.解码:二进制数据到字符串转换的过程. iconv-lite: Pure JS character encoding conversion 多种类型字符串(包括gbk ...

  8. [数据结构] 散列表(哈希表)

    散列表(哈希表) 比较难理解的官方定义:散列表/哈希表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的 ...

  9. python字典编码_Python列表,字典,元组,字符串操作,文件操作,字符编码

    1. 列表操作 1.1 列表的定义: names = ["wangjing", "wangjun", "hashiqi"] names[0] ...

最新文章

  1. 重载输入cin和输出cout运算符
  2. python如何调用cpp文件的接口函数_C++中嵌入Python调用
  3. QT学习:QTime类
  4. mysql的错误号大全
  5. 中国国家高速公路网详细布局
  6. 信息学奥赛一本通(1186:出现次数超过一半的数)
  7. 掌握 Linux 调试技术
  8. 数据结构 【实验 串的基本操作】
  9. 微服务架构实战:Swagger规范RESTful API
  10. 专题九:Simulink系统仿真
  11. 艾宾浩斯记忆表格excel_【日常福利】NAWL-最重要、最高频的学术词汇表【Anki+Excel资源免费送】...
  12. 5-7 六度空间 (30分)
  13. 2018软工—团队现场编程实战(抽奖系统)
  14. None of the following candidates is applicable because of a receiver type mismatch
  15. POI excel单元格中内容换行
  16. IAR在写结构体时不提示_如何写好个人事迹?
  17. 卡车自动装载系统(ATLS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. 【图像处理】条形码与二维码的定位与识别
  19. 安装语音计算机到桌面,桌面百度推出 语音搜索技术让电脑听“人话”
  20. Pandas库的使用教程,每个程序都配图,两万字保姆教学轻松学会

热门文章

  1. POJ 2187 Beauty Contest( 凸包求最远点对 )
  2. Zend Guard6.0使用教程——PHP代码加密
  3. Android系统Google Maps开发实例浅析
  4. JavaScript —— 如何判断一个非数字输入
  5. C/C++中memset()函数
  6. ATAC-seq【Harvard FAS Informatics】
  7. 随机森林——气温预测(2/2)
  8. 数据库:SQL Server与MySQL
  9. android selector下的设置背景属性值
  10. FeiBoStr 斐波那契