在python中字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }
  • 键必须是唯一的,但值则不必。
  • 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print('Michael的成是:', d['Michael'])

以上代码,输出:

Michael的成是: 95

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。dict就是第二种实现方式。

1、访问字典里的值

把相应的键放入熟悉的方括弧,如下实例:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}

print("dict['Name']: ", dict['Name'])
print("dict['Age']: ", dict['Age'])

以上代码,输出:

dict['Name']:  roy
dict['Age']: 1

如果key不存在,dict就会报错:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
print("dict['sex']: ", dict['sex'])

以上代码,输出:

Traceback (most recent call last):
File "D:/python/teaching/01.py", line 2, in <module>
print("dict['sex']: ", dict['sex'])
KeyError: 'sex'

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}

if 'sex' in dict:
print("dict['sex']: ", dict['sex'])
else:
print('没有找到key=sex的元素')

以上代码,输出:

没有找到key=sex的元素

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}

if dict.get('sex'):
print("dict['sex']: ", dict['sex'])
else:
print(dict.get('sex','没有找到key=sex的元素')) # 自己指了一个value

以上代码,输出:

没有找到key=sex的元素

注意:返回None的时候Python的交互环境不显示结果。

2、修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict['Age'] = 100 # 更新 Age
dict['sex'] = '男' # 添加 sex print('dict[\'Age\'] :', dict['Age'])
print('dict[\'sex\'] :', dict['sex'])

以上代码,输出:

dict['Age'] : 100
dict['sex'] : 男

3、删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用del命令,如下实例:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict['Age'] = 100 # 更新 Age
dict['sex'] = '男' # 添加 sex del dict['Age'] # 删除键 'Age'
print('dict :', dict)

以上代码,输出:

dict : {'Name': 'roy', 'Class': 'First', 'sex': '男'}

也可以用clear()清空字典:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict.clear() # 清空字典
print('dict :', dict)

以上代码,输出:

dict : {}

也可以删除整个字典:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
del dict # 删除字典
print('dict :', dict)

以上代码,输出:

dict : <class 'dict'>

执行 del 操作后字典不再存在了

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict.pop('Name') # 删除键 'Name'
print('dict :', dict)

以上代码,输出:

dict : {'Age': 1, 'Class': 'First'}

注意,dict内部存放的顺序和key放入的顺序是没有关系的。

和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key

python3 第十四章 - 数据类型之Dictionary(字典)的更多相关文章

  1. python3 第十五章 - 数据类型之Sets(集合)

    python的官网里对集合的描述是: Python also includes a data type for sets. A set is an unordered collection with ...

  2. python3 第十二章 - 数据类型之List(列表)

    Python内置的一种数据类型是列表:list. list是一种有序的集合 可以随时添加和删除其中的元素. 它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只 ...

  3. python3 第二十四章 - 函数式编程之Anonymous function(匿名函数)

    匿名函数指一类无须定义标识符的函数或子程序.Python用lambda语法定义匿名函数,只需用表达式而无需申明.lambda语法的定义如下: lambda [arg1 [,arg2, ... argN ...

  4. JavaScript高级程序设计:第十四章

    第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...

  5. 进击的Python【第十四章】:Web前端基础之Javascript

    进击的Python[第十四章]:Web前端基础之Javascript 一.javascript是什么 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编 ...

  6. Python 3标准库 第十四章 应用构建模块

    Python 3标准库 The Python3 Standard Library by  Example -----------------------------------------第十四章   ...

  7. 20190827 On Java8 第十四章 流式编程

    第十四章 流式编程 流的一个核心好处是,它使得程序更加短小并且更易理解.当 Lambda 表达式和方法引用(method references)和流一起使用的时候会让人感觉自成一体.流使得 Java ...

  8. 【odoo14】第十四章、CMS网站开发

    第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...

  9. 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记

    第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...

随机推荐

  1. php require、require_once和include、include_once的区别

    一.引入php文件路径的方法require '文件路径'; require ('文件路径');require_once '文件路径'; require_once ('文件路径');include 同 ...

  2. JS ajaxfileUpload 一次性上传多个input控件 上传多个文件

    本方法适用于一次性上传多个input框输入的文件,如下图所示,任务是需要一次上传两个input框提供的两个文件. 具体方法: 1.修改ajax调用方法 如上图所示,只需要将ajaxFileUpload ...

  3. js 拼接table 的方法

    <html> <head> <title>test page</title> <script type='text/javascript'> ...

  4. 定义一个数,它可能为正 也可能为负 var num = Math.pow(-1,parseInt(Math.random() * 2) + 1);

    // 定义一个随机数范围从0 ~页面宽度 var x = parseInt(Math.random() * myCanvas.width); // 定义一个随机数 范围从0 ~页面高度 var y = ...

  5. uboot中 make xxx_config 的作用(以make smdk2410_config为例)

    1.创建到目标板相关文件的链接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/proc 2.创建i ...

  6. 七牛php-sdk使用-文件上传

    使用七牛进行文件上传可以有多种方式: 直接form表单上传,需要自己按照文档做配置 使用七牛jssdk,部署较简单,大文件分片上传 php-sdk后台上传 首先,所有的上传方法以及所有的跟七牛接口相关 ...

  7. 51Nod 1080 两个数的平方和(数论,经典题)

    1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果 ...

  8. 【Java学习笔记之七】java函数的语法规则总结

    函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...

  9. Java数据结构和算法(十二)——2-3-4树

    通过前面的介绍,我们知道在二叉树中,每个节点只有一个数据项,最多有两个子节点.如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树.本篇博客我们将介绍的——2-3-4树,它是一种多叉树,它的每 ...

  10. [国嵌攻略][070][GDB调试程序]

    GDB是GNU发布的一款功能强大的调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试的程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检测程序状态. GDB使用流程 1 ...