映射
映射表示由任意索引集索引的有限的,无序的,键不重复的对象集合.目前有一种映射类型:字典.
一,字典
一个字典对象是可变的,它是一个容器类型,可以通过
{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() 返回映射中元素的个数.
从 Python 2.2 开始,你可以不必再用 keys() 方法获取供循环使用的键值列表了.可以用迭代器来轻松地访问类序列对象 (sequence-like objects),比如字典和文件.只需要用字典的名字就可以在 for 循环里遍历字典.
要想遍历一个字典 (一般用键), 你只需要循环查看它的键.
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 inh 操作符来检查某个键是否存在于字典中.
三,字典可用的内建函数
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() 清空字典
来源: http://www.jianshu.com/p/c3267ad3ada2