Python一一字典(dict)
字典
概念:如果把列表看做是有序的对象集合,那么就可以把字典当成是无序的集合。它们主要的差别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
属性:
(1).通过键而不是偏移量来读取
(2).任意对象的无序集合
(3).可变长、异构、任意嵌套
(4).属于可变映射类型
(5).对象引用表(散列表)
常见操作:
实际应用中的字典
在Python3.0中,我们必须将其放到一个list调用中一一Python3.0中的keys返回一个迭代器,而不是一个物理的列表。list调用迫使它一次生成所有的值,以便我们可以将其打印出来。而在Python2.6中,keys构建并返回一个真正的列表,因此,list调用不需要显示结果。
原处修改字典
与列表相同,字典也是可变的,因此可以在原处对它们进行修改、扩展以及缩短而不需要生成新字典。
与列表的同异点:
相同点:与列表相同,向字典中已存在的索引赋值会改变与索引相关联的值
不同点:与列表不同,每当对新字典键进行赋值(之前没有被赋值的键),就会在字典内生成一个新的元素。在列表中情况不同,因为Python会将超出列表末尾的偏移视为越界并报错。要想扩充列表,需要使用append方法或分片赋值来实现。
其他字典方法
语言表
字典用法注意事项
序列运算无效
字典是映射机制,不是序列。因为字典元素间没有顺序的概念,类似串联(有序合并)和分片(提取相邻片段)这样的运算是不能用的
对新索引赋值会添加项
当你编写字典常量时(此时的键是嵌套于常量本身的),或者向现有字典对象的新键赋值时,都会生成键,最终的结果是一样的
键不一定总是字符串
我们的例子中都使用字符串作为键,但任何不可变对象(也就是说不是列表)也是可以的。例如,你可以用整数作为键,这样让字典看起来像列表(至少进行索引时很像)。元组偶尔允许合并键值时也可以用作字典键。只要它有合适的协议方法,类实例对象也可以用作键。大体上讲,它需要告诉Python其值不变,否则作为固定键将会毫无用处。
使用字典模拟灵活的列表
可以看到,对在列表末尾外的偏移赋值是非法的,我们可以通过字典来做类似的事情,这样就不需要分配足够大的列表了,如下:
字典用于稀疏数据结构
在这里,我们用字典表示一个三维数组,这个数组只有两个位置(2,3,4)和(7,8,9)有值,其他位置都为空。键是元组,它们记录非空元素的坐标。我们并不是分配一个庞大而几乎为空的三维矩阵,而是用一个简单的两个元素的字典。通过这一方式读取空元素时,会触发键不存在的异常。
避免missing-key错误
至少存在三种方式避免读取不存在的键的错误,如下所示:
使用字典作为“记录”
创建字典的其他方法
四种形式都会建立相同的两键字典,但它们在不同的条件下有用
如果你可以事先拼出整个字典,那么第一种很方便
如果你需要一次动态地建立字典的一个字段,第二种比较合适
第三种关键字形式所需的代码比常量少,但是键必须都是字符串才行
如果你需要在程序运行时把键和值逐步建成序列,最后一种形式比较有用。
如果所有键的值都相同,你可以用这个特殊的形式对字典进行初始化一一简单地传入一个键列表,以及所有键的初始值(默认值为空)
Python3.0中的字典变化
Python3.0中的字典:
支持一种新的字典解析表达式,这是列表和集合解析的“近亲”。
对于D.key、D.values和D.items方法,返回壳迭代的视图,不是列表
由于前面一点,需要新的编码方式通过排序键来遍历
不再直接支持相对大小比较一一取而代之的是手动比较
不再有D.has_key方法一一相反,使用in成员关系测试
字典解析
字典解析也隐式地运行一个循环,根据每次迭代收集表达式的键/值结果,并且使用它们来填充一个新的字典。一个循环变量允许解析在过程中使用循环迭代值。
例如在Python2.6和Python3.0中,动态初始化一个字典的标准方式:将其键和值对应起来并把结果传递给dict调用。
zip函数是在一个单个调用中从键和值的列表来构建一个字典的方式之一。如果不能在代码中预计键和值的集合,总是可以将它们构建为列表然后再对应起来:
在Python3.0中,可以用一个字典解析表达式来实现同样的效果。
后者暗示的要更为通用一一我们可以使用它们把单独的一串值映射到字典,并且键和值一样,也可以用表达式来计算:
字典解析对于从键列表来初始化字典也很有用,这和我们在前一小节末尾遇到的fromkeys方法相似,如下所示:
字典视图
在Python3.0中,字典的keys、values和items都返回视图对象,而在Python2.6中,它们返回实际的结果列表。
视图对象是可迭代的,这就意味着对象每次产生一个结果项,而不是在内存中立即产生结果列表。除了是可迭代的,字典视图还保持了字典成分的最初的顺序,反映字典未来的修改,并且能够支持集合操作。另一方面,它们不是列表,并且不支持像索引和列表sort方法这样的操作,打印的时候它们也不显示自己的项。
如果想要应用列表操作或者显示它们的值,我们必须通过内置函数list来运行这3个方法的结果:
字典视图和几何