需要将一系列值组合成数据结构并通过编号来访问各个值时,列表很有用。本章介绍一种可通过名称来访问其各个值的数据结构。这种数据结构称为映射(mapping)。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
1、字典的用途
字典的名称指出了这种数据结构的用途。
在很多情况下,使用字典都比使用列表更合适。下面是Python字典的一些用途:
表示棋盘的状态,其中每个键都是由坐标组成的元组;
存储文件修改时间,其中的键为文件名;
数字电话/地址簿
2 创建和使用字典
字典由键及其相应的值组成,这种键值对称为项(item)。每个键与其值之间都用冒号(:)分隔,项之间用逗号分隔,而整个字典放在花括号内。空字典(没有任何项)用两个花括号表示,类似于下面这样:{}。
注意:列表放在【】中,元祖一般由逗号和()组成,而字符串由""或者‘’组成,字典由{}组成
注意 在字典(以及其他映射类型)中,键必须是独一无二的,而字典中的值无需如此
2.1 函数dict
可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典
还可使用关键字实参来调用这个函数,如下所示:
注意:以下表述是错误的
2.2 基本的字典操作
字典的基本行为在很多方面都类似于序列。
len(d)返回字典d包含的项(键值对)数。
d[k]返回与键k相关联的值。
d[k] = v将值v关联到键k。
del d[k]删除键为k的项。
k in d检查字典d是否包含键为k的项。
虽然字典和列表有多个相同之处,但也有一些重要的不同之处。
键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变的类型,如浮点数(实数)、字符串或元组。
自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不使用append或其他类似的方法,就不能给列表中没有的元素赋值。
成员资格:表达式k in d(其中d是一个字典)查找的是键而不是值,而表达式v in l(其中l是一个列表)查找的是值而不是索引。这看似不太一致,但你习惯后就会觉得相当自然。毕竟如果字典包含指定的键,检查相应的值就很容易
前述第一点(键可以是任何不可变的类型)是字典的主要优点。第二点也很重要,下面的示例说明了这种差别:
2.3 将字符串格式设置功能用于字典
可使用字符串格式设置功能来设置值的格式,这些值是作为命名或非命名参数提供给方法format的。在有些情况下,通过在字典中存储一系列命名的值,可让格式设置更容易些。例如,可在字典中包含各种信息,这样只需在格式字符串中提取所需的信息即可。为此,
必须使用format_map来指出你将通过一个映射来提供所需的信息。
像这样使用字典时,可指定任意数量的转换说明符,条件是所有的字段名都是包含在字典中的键。
2.4 字典方法
与其他内置类型一样,字典也有方法。字典的方法很有用,但其使用频率可能没有列表和字符串的方法那样高。
2.4.1 clear
方法clear删除所有的字典项,这种操作是就地执行的(就像list.sort一样),因此什么都不返回(或者说返回None)
注意:第一张图中使用a={},但是对b没有影响,第二张图中使用a.clear,导致a和b同时清空,原因为:b=a之后相当于a和b都指向一个相同的字典,a={}表示将a指向另外一个为空的字典,但是此时b还是指向原来的有内容的字典;a.clear则是将a指向的字典中的内容清空,由于b也指向同一个字典,故此时a和b都为空
2.4.2 copy
方法copy返回一个新字典,其包含的键-值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。
如你所见,当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值
为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值,等等。为此,可使用模块copy中的函数deepcopy
2.4. 3 fromkeys
方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None
直接对dict(前面说过,dict是所有字典所属的类型。类和类型将调用方法fromkeys。
如果你不想使用默认值None,可提供特定的值。
2.4.4 get
方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。
而使用get不会这样:使用get来访问不存在的键时,没有引发异常,而是返回None。你可指定“默认”值,这样将返回你指定的值而不是None。如果字典包含指定的键,get的作用将与普通字典查找相同。
2.4.5 items
方法items返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。字典项在列表中的排列顺序不确定
返回值属于一种名为字典视图的特殊类型。另外,你还可确定其长度以及对其执行成员资格检查
2.4.6 keys
方法keys返回一个字典视图,其中包含指定字典中的键。
2.4.7 pop
方法pop可用于获取与指定键相关联的值,并将该键值对从字典中删除
2.4.8 popitem
方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。如果你要以高效地方式逐个删除并处理所有字典项,这可能很有用,因为这样无需先获取键列表
2.4.9 setdefault
方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键-值对。
2.4.10 update
方法update使用一个字典中的项来更新另一个字典
对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它
2.4. 11 valus
方法values返回一个由字典中的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复的值。
3、小结
映射:映射让你能够使用任何不可变的对象(最常用的是字符串和元组)来标识其元素。Python只有一种内置的映射类型,那就是字典
将字符串格式设置功能用于字典:要对字典执行字符串格式设置操作,不能使用format和命名参数,而必须使用format_map
字典方法:字典有很多方法,这些方法的调用方式与列表和字符串的方法相同。