Python基础手册13——映射(字典)
映射
映射表示由任意索引集索引的有限的,无序的,键不重复的对象集合。目前有一种映射类型:字典。
一、字典
一个字典对象是可变的,它是一个容器类型,可以通过 {key1:value1, key2:value2,...}
方法创建。字典能存储任意个数的 Python 对象,也包括其他的容器类型。字典的索引操作使用的是和序列相同的语法,但是在方括号中的元素是键,而不是相对位置,作为映射,字典仅支持通过键获取元素。每个键只能对应一个值,一键对应多个值是不允许的。对一个新的字典的键赋值会创建该键。
几乎所有类型的 Python 不可变对象都可以用作键(字典的键需要密钥的哈希值保持不变),不过一般还是以数字或者字符串最为常用。值可以是任意类型的 Python 对象。
字典类型和序列类型(列表、元组)的区别是存储和访问数据的方式不同。序列类型只用数字类型的键(从序列的开始起按数值顺序索引)。字典类型可以用其他对象类型做键,一般最常见的是用字符串做键(keys)。和序列类型的键不同,映射类型的键(keys)直接或间接地和存储的数据值相关联,而且映射类型中的数据是无序排列的。
除了列表以外,字典也许是Python之中最灵活的内置数据结构类型,如果把列表看做是有序的对象集合,那么就可以把字典当成是无序的集合。它们主要的差别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。对字典进行索引是非常快速的搜索操作,Python采用最优化的散列算法来寻找键,因此使用键查找的速度非常快。字典存储的是对象的引用(不是拷贝)。
哈希表与字典的关系
序列类型用有序的数字键做索引将数据以数组的形式存储。 一般,索引值与所存储的数据毫无关系。还可以用另一种方式来存储数据:基于某种相关值, 比如说一个字符串。
我们在日常生活中一直这么做。你把人们的电话号码按照他们的姓记录在电话簿上,你按照时间在日历或约会簿上添加事件,等等。在这些例子中,你的键(key)就是和数据项相关的值。哈希表是一种数据结构,哈希表中存储的每一条数据,叫做一个值(value),是根据与它相关的一个被称作为键(key)的数据项进行存储的。键和值合在一起被称为“键-值 对”(key-value pairs)。 哈希表的算法是获取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中来存储你的值。任何一个值存储的地址皆取决于它的键。正因为这种随意性,哈希表中的值是没有顺序的。你拥有的是一个无序的数据集。哈希表一般有很好的性能,用键查询相当快。
你所能获得的有序集合只能是字典中的键的集合或者值的集合。方法 Keys() 或 values() 返回一个列表,该列表是可排序的。 你还可以用 items()方法得到包含键、值对的列表来排序。
二、字典的基本操作
1、创建字典
一个字典条目的语法格式是 键:值 。 而且,多条字典条目被包含在 { }
里。创建字典只需要把字典赋值给一个变量,不管这个字典是否包含元素。
可以用工厂方法 dict()
来创建字典。
从 Python 2.3 版本起,可以用一个很方便的内建方法 fromkeys()
来创建一个"默认"字典,字典中元素具有相同的值 (如果没有给出, 默认为 None)。
2、访问字典中的值
下标表示法 a[k]
从映射对象 a 中选择由 k 键索引的元素,它可以用在表达式中用于赋值或作为 del() 语句的目标。内建函数 len()
返回映射中元素的个数。
3、更新字典
你可以通过以下几种方式对一个字典做修改:添加一个新数据项或新元素(即,一个键-值对);修改一个已存在的数据项;或删除一个已存在的数据项。删除整个字典的操作不常见。通常,你删除字典中的单个元素或是清除整个字典的内容。但是,如果你真想"删除"一个字典,用 del()
语句。使用 clear()
方法清除整个字典的内容。使用 pop()
方法删除指定的元素并返回其值。
三、字典类型操作符
字典可以和所有的标准类型操作符一起工作,但却不支持像拼接(concatenation)和重复(repetition)这样的操作。这些操作对序列有意义,可对映射类型行不通。
1、字典的键查找操作符([ ])
键查找操作符是唯一仅用于字典类型的操作符,它和序列类型里单一元素的切片(slice)操作符很相象。对序列类型来说,用索引做唯一参数或下标(subscript)以获取一个序列中某个元素的值。对字典类型来说,是用键(key)查询(字典中的元素),所以键是参数(argument),而不是一个索引(index)。键查找操作符既可以用于给字典赋值,也可以用于从字典中取值。
d[k] = v 通过键'k',给字典中某元素赋值'v'
d[k] 通过键'k',查询字典中某元素的值
2、(键)成员关系操作( in,not in)
使用 in
和 not in
h 操作符来检查某个键是否存在于字典中。
三、字典可用的内建函数
1、dict()
工厂函数 dict()
被用来创建字典。如果不提供参数,会生成空字典。当容器类型对象做为一个参数传递给方法 dict() 时,如果参数是可以迭代的,即,一个序列,或是一个迭代器,或是一个支持迭代的对象,那每个可迭代的元素必须成对出现。在每个值对中,第一个元素是字典的键、第二个元素是字典中的值。
如果输入参数是(另)一个映射对象,比如,一个字典对象,对其调用 dict() 会从存在的字典里复制内容来生成新的字典。新生成的字典是原来字典对象的浅复制版本, 它与用字典的内建方法 copy()
生成的字典对象是一样的。但是从已存在的字典生成新的字典速度比用 copy() 方法慢,我们推荐使用 copy()。
2、len()
内建函数 len()
很灵活。它可用在序列、映射类型和集合上(在本章的后面我们会看到)。对字典调用 len(),它会返回所有元素(键-值对)的数目。
3、hash()
内建函数 hash() 本身并不是为字典设计的方法, 但它可以判断某个对象是否可以做一个字典的键。将一个对象作为参数传递给 hash(),会返回这个对象的哈希值。 只有这个对象是可哈希的,才可作为字典的键 (函数的返回值是整数,不产生错误或异常)。
如果用比较操作符来比较两个数值,发现它们是相等的,那么即使二者的数据类型不同, 它们也会得到相同的哈希值。
如果非可哈希类型作为参数传递给 hash() 方法,会产生 TypeError 错误(因此,如果使用这样的对象作为键给字典赋值时会出错)。
四、字典类型内建方法
1、update() 使用指定的字典更新字典
2、keys() values() 返回字典的键、值
3、get() 找到指定的键的值
4、pop() 删除指定的键对应的元素
5、setdefault() 在字典中取指定键的值,如果不存在就按我们指定的键和默认的值插入到字典中
6、clear() 清空字典
《Python基础手册》系列:
Python基础手册 1 —— Python语言介绍
Python基础手册 2 —— Python 环境搭建(Linux)
Python基础手册 3 —— Python解释器
Python基础手册 4 —— 文本结构
Python基础手册 5 —— 标识符和关键字
Python基础手册 6 —— 操作符
Python基础手册 7 —— 内建函数
Python基础手册 8 —— Python对象
Python基础手册 9 —— 数字类型
Python基础手册10 —— 序列(字符串)
Python基础手册11 —— 序列(元组&列表)
Python基础手册12 —— 序列(类型操作)
Python基础手册13 —— 映射(字典)
Python基础手册14 —— 集合
Python基础手册15 —— 解析
Python基础手册16 —— 文件
Python基础手册17 —— 简单语句
Python基础手册18 —— 复合语句(流程控制语句)
Python基础手册19 —— 迭代器
Python基础手册20 —— 生成器
Python基础手册21 —— 函数的定义
Python基础手册22 —— 函数的参数
Python基础手册23 —— 函数的调用
Python基础手册24 —— 函数中变量的作用域
Python基础手册25 —— 装饰器
Python基础手册26 —— 错误 & 异常
Python基础手册27 —— 模块
Python基础手册28 —— 模块的高级概念
Python基础手册29 —— 包