在 Python 中,字典是核心数据结构。字典可以存储任意数量的对象,每个对象都由唯一的字典键标识。

字典通常也被称为映射、散列表、查找表或关联数组。字典能够高效查找、插入和删除任何与给定键关联的对象。

这在现实中意味着什么呢?字典对象相当于现实世界中的电话簿。

电话簿有助于快速检索与给定键(人名)相关联的信息(电话号码)。因此不必为了查找某人的号码而浏览整本电话簿,根据人名基本上就能直接跳到需要查找的相关信息。

若想研究以何种方式组织信息才有利于快速检索,上述类比就不那么贴切了。但基本性能特征相同,即字典能够用来快速查找与给定键相关的信息。

总之,字典是计算机科学中最常用且最重要的数据结构之一。

那么 Python 如何处理字典呢?

我们来看看 Python 及其标准库中可用的字典实现。

dict——首选字典实现

由于字典非常重要,因此 Python 直接在语言核心中实现了一个稳健的字典 1:dict 数据类型 2。

1 为了与其他资料统一,这里将不区分中文语境下的 dict(字典)和“字典类型的数据结构”,统称为“字典”。——译者注

2 详见 Python 文档:“Mapping Types — dict”。

Python 还提供了一些有用的“语法糖”来处理程序中的字典。例如,用花括号字典表达式语法和字典解析式能够方便地创建新的字典对象:

在学习过程中有什么不懂得可以加我的

python学习交流扣扣qun,784758214

群里有不错的学习视频教程、开发工具与电子书籍。

与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容

phonebook = {

'bob': 7387,

'alice': 3719,

'jack': 7052,

}

squares = {x: x * x for x in range(6)}

>>> phonebook['alice']

3719

>>> squares

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

关于哪些对象可以作为字典键,有一些限制。

Python 的字典由可散列类型 3 的键来索引。可散列对象具有在其生命周期中永远不会改变的散列值(参见 hash),并且可以与其他对象进行比较(参见 eq)。另外,相等的可散列对象,其散列值必然相同。

像字符串和数这样的不可变类型是可散列的,它们可以很好地用作字典键。元组对象也可以用作字典键,但这些元组本身必须只包含可散列类型。

Python 的内置字典实现可以应对大多数情况。字典是高度优化的,并且是 Python 语言的基石,例如栈帧中的类属性和变量都存储在字典中。

Python 字典基于经过充分测试和精心调整过的散列表实现,提供了符合期望的性能特征。一般情况下,用于查找、插入、更新和删除操作的时间复杂度都为 O(1)。

大部分情况下,应该使用 Python 自带的标准字典实现。但是也存在专门的第三方字典实现,例如跳跃表或基于 B 树的字典。

除了通用的 dict 对象外,Python 的标准库还包含许多特殊的字典实现。它们都基于内置的字典类,基本性能特征相同,但添加了其他一些便利特性。

下面来逐个了解一下。

collections.OrderedDict——能记住键的插入顺序

collections.OrderedDict 是特殊的 dict 子类,该类型会记录添加到其中的键的插入顺序。

尽管在 CPython 3.6 及更高版本中,标准的字典实现也能保留键的插入顺序,但这只是 CPython 实现的一个副作用,直到 Python 3.7 才将这种特性固定下来了。因此,如果在自己的工作中很需要用到键顺序,最好明确使用 OrderedDict 类。

顺便说一句,OrderedDict 不是内置的核心语言部分,因此必须从标准库中的 collections 模块导入。

复制代码

>>> import collections

>>> d = collections.OrderedDict(one=1, two=2, three=3)

>>> d

OrderedDict([('one', 1), ('two', 2), ('three', 3)])

>>> d['four'] = 4

>>> d

OrderedDict([('one', 1), ('two', 2),

('three', 3), ('four', 4)])

>>> d.keys()

odict_keys(['one', 'two', 'three', 'four'])

collections.defaultdict——为缺失的键返回默认值

defaultdict 是另一个 dict 子类,其构造函数接受一个可调用对象,查找时如果找不到给定的键,就返回这个可调用对象。

与使用 get() 方法或在普通字典中捕获 KeyError 异常相比,这种方式的代码较少,并能清晰地表达出程序员的意图。

>>> from collections import defaultdict

>>> dd = defaultdict(list)

# 访问缺失的键就会用默认工厂方法创建它并将其初始化

# 在本例中工厂方法为 list():

>>> dd['dogs'].append('Rufus')

>>> dd['dogs'].append('Kathrin')

>>> dd['dogs'].append('Mr Sniffles')

>>> dd['dogs']

['Rufus', 'Kathrin', 'Mr Sniffles']

collections.ChainMap——搜索多个字典

collections.ChainMap 数据结构将多个字典分组到一个映射中 8,在查找时逐个搜索底层映射,直到找到一个符合条件的键。对 ChainMap 进行插入、更新和删除操作,只会作用于其中的第一个字典。

>>> from collections import ChainMap

>>> dict1 = {'one': 1, 'two': 2}

>>> dict2 = {'three': 3, 'four': 4}

>>> chain = ChainMap(dict1, dict2)

>>> chain

ChainMap({'one': 1, 'two': 2}, {'three': 3, 'four': 4})

# ChainMap 在内部从左到右逐个搜索,

# 直到找到对应的键或全部搜索完毕:

>>> chain['three']

3

>>> chain['one']

1

>>> chain['missing']

KeyError: 'missing'

types.MappingProxyType——用于创建只读字典

MappingProxyType 封装了标准的字典,为封装的字典数据提供只读视图。该类添加自 Python 3.3,用来创建字典不可变的代理版本。

举例来说,如果希望返回一个字典来表示类或模块的内部状态,同时禁止向该对象写入内容,此时 MappingProxyType 就能派上用场。使用 MappingProxyType 无须创建完整的字典副本。

>>> from types import MappingProxyType

>>> writable = {'one': 1, 'two': 2}

>>> read_only = MappingProxyType(writable)

# 代理是只读的:

>>> read_only['one']

1

>>> read_only['one'] = 23

TypeError:

"'mappingproxy' object does not support item assignment"

# 更新原字典也会影响到代理:

>>> writable['one'] = 42

>>> read_only

mappingproxy({'one': 42, 'two': 2})

小结:Python 中的字典

本节列出的所有 Python 字典实现都是内置于 Python 标准库中的有效实现。

对Python感兴趣或者是正在学习的小伙伴,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每天都有大牛定时讲解Python技术,分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

一般情况下,建议在自己的程序中使用内置的 dict 数据类型。这是优化过的散列表实现,功能多且已被直接内置到了核心语言中。

如果你有内置 dict 无法满足的特殊需求,那么建议使用本节列出的其他数据类型。

虽然前面列出的其他字典实现均可用,但大多数情况下都应该使用 Python 内置的标准 dict,这样其他开发者在维护你的代码时就会轻松一点。

python 映射表结构_Python 中常见的数据结构:字典、映射和散列表相关推荐

  1. python修改数据库表结构_python中数据库的相关操作-pymysql

    python3中可以使用库pymysql 数据准备: 搭建一个数据库,我是在docker下搭建的Mysql(端口号是3306,账号是root,密码123456) 建立数据库test_db,表TB_St ...

  2. python配什么数据库_python中常见数据库有哪些

    python中常见的数据库有哪些呢?数据库大致分为两大类,第一类是包括关系数据库,第二类是非关系数据库,下面介绍一下这两类数据库的相关知识. 包括关系数据库:sqlite,mysql,mssql 非关 ...

  3. python有什么颜色_Python中常见颜色记录

    python中常见绘图的颜色选择 常见颜色 可选的颜色库 颜色名称对应的颜色码 names = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', ...

  4. python中table表结构_python中的简易表格prettytable

    安装:pip install PrettyTable 普通表格 from prettytable import PrettyTable table = PrettyTable(['编号','云编号', ...

  5. python的程序结构_python中的程序结构

    程序结构: 主要是指结构化程序设计.它把一个程序分成若干互相独立的模块.在程序设计时,只要各个模块设计正确了,就可以保证整个程序也肯定设计正确. 结构化程序是由若干个基本结构组成而成,每一个结构可以包 ...

  6. python快速入门【二】----常见的数据结构

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  7. Python之pandas:pandas中常见的数据类型转换四大方法以及遇到的一些坑之详细攻略

    Python之pandas:pandas中常见的数据类型转换四大方法以及遇到的一些坑之详细攻略 目录 pandas中常见的数据类型转换方法 T1.读取时直接转换数据类型 T2.采用astype

  8. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  9. java中常见的数据结构分类

    自己总结了下java中常见的数据结构和分类 在这里,我总结了list中数据结构对应我们所学的线性表,属于顺序存储还是链式存储,但没有总结set数据结构对应我们所学的哪一种(按理说应该是集合),是因为t ...

最新文章

  1. 二十五、Kaggle | 全球听众最多的50首歌曲
  2. MySQL中的information_schema
  3. qt设置行编辑器不可编辑
  4. [转]新来的大神用策略模式把if else给优化了,技术总监说:能不能想好了再改?...
  5. VS 2010 SP1 and SQL CE :ScottGu's Blog
  6. VALSE学习(十五):网络搜索结构-NAS
  7. oracle分页查询最常用的,常用的数据库分页查询语句
  8. 以为精通Java 线程池,看到这些误区,还是年轻了
  9. Android DVM简介
  10. 解决谷歌的but your computer or network may be sending automated queries
  11. opencv 简单的裂缝检测
  12. Ceph运维告诉你分布式存储的那些“坑”
  13. MongoDB数据库设计中6条重要的经验法则(一)
  14. 专题:预测大盘20190410
  15. 十二星座的12种风味咖啡,最后一个能让你上瘾
  16. 制作 ESXI6.7 U盘安装盘
  17. 矛与盾的较量-南美洲巅峰对决
  18. 傲酷(Oculii)获通用汽车战略投资,软件或引发毫米波雷达新变革
  19. 阿里巴巴集团增持阿里影业股权完成交割
  20. GoSURF、MyIe2、小树浏览肉搏篇(转)

热门文章

  1. html点击按钮复制一个样式,这10个按钮,把 CSS HOVER 的创意发挥到极致了
  2. Oracle 性能优化的基本方法概述
  3. MyISAM和Memory
  4. 猎豹汽车与联想集团达成大数据战略合作
  5. 苹果手机如何微信分身?
  6. 大学生开学必备好物推荐、学生党必备好物推荐清单
  7. “算法考核没过,老板找我聊了3个小时”:离职程序员重刷数学题
  8. oracle服务器12541,sqlplus连接虚拟机服务器报ORA-12541错误
  9. 导出一个Java项目
  10. javaweb基于JSP+Servlet开发在线个人理财系统+论文 课程设计 大作业源码