在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. css布局--水平居中

    一.水平居中 1. 使用text-align和display:inline-block实现水平居中 html <div class="parent"> <div ...

  2. #多个关联的python程序在linux后台运行

    由于在shell脚本中直接使用&符号和python程序有冲突,不能正常的进入后台执行python(多番尝试python xxx.py &,后面的&总是不能正常识别.系统cent ...

  3. tensorflow mnist read_data_sets fails

    下载处理mnist数据时出现如下错误 VisibleDeprecationWarning: converting an array with ndim > 0 to an index will ...

  4. [python]使用xlrd对Excel表格进行读写操作

    2.1 导入模块 import xlrd 2.2 打开Excel文件读取数据 data = xlrd.open_workbook("excelFile.xls") 2.3 使用技巧 ...

  5. python3之日期和时间

    1.python3日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时 ...

  6. IdentityServer(15)- 第三方快速入门和示例

    这些示例不由IdentityServer团队维护. IdentityServer团队提供链接到了社区示例,但不能对示例做任何保证. 如有问题,请直接与作者联系. 各种ASP.NET Core安全示例 ...

  7. nautilus出现一闪而过现象

    linux相关问题: 1.这几天在使用乌班图时,出现文件夹打开一闪而过现象,于是我试着使用命令行来启动: sudo nautilus 出现下面这一堆错误(error_info): (nautilus: ...

  8. python 数据类型之集合

    一.集合的定义: 定义:由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key. 特性:集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值 二 ...

  9. 使用quartz实现不重启服务器修改自定义配置

    为了方便维护系统,开发中通常会设置一些自定义参数,写在单独的配置文件里,需要调整时可直接登录服务器修复配置文件,而不需要修改程序.但尴尬的是,web服务器并不会自动重新加载配置文件,重启服务器又会中断 ...

  10. VSTS/TFS Auto Build

    前几天使用VSTS配置自动部署前端网站(AngularJS)和RESTfulAPI(.NET)到客户环境. 由于都是参考官方文档 https://docs.microsoft.com/zh-cn/vs ...