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() 返回映射中元素的个数。

从 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)

使用 innot 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() 清空字典


《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 —— 包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269