Skip to content

Latest commit

 

History

History
68 lines (57 loc) · 2.96 KB

dictionaries.md

File metadata and controls

68 lines (57 loc) · 2.96 KB

字典就像列表一样,但是字典更通用。在列表中,索引位置必须是整数,但是在字典中,索引几乎可以是任意类型。

你可以把字典看作是一系列的索引(这里叫做键key)和一系列的值之间的映射。每个键对应一个值,键和值之间的关系成为键值对,有时也称为数据项。

举个例子,我们将创建一个英语映射到西班牙语的字典,键和值都是字符串。

dict函数创建了一个新的字典,没有任何的键值对。因为dict是内置函数的名称,所以不要用它做变量名。

>>> eng2sp = dict()
>>> print(eng2sp)
{}

大括号{}表示一个空字典,要添加数据项到字典,可以使用中括号:

>>> eng2sp['one'] = 'uno'

这行语句创建了一个从键one到值uno映射的数据项。再次打印这个字典,我们会看到一个键值对,间和值之间用冒号隔开:

>>> print(eng2sp)
{'one': 'uno'}

这种输出的格式也是一种输入的格式,例如,你可以创建一个新的带有三个数据项的字典,但是如果你打印出eng2sp,你可能会有点惊讶:

>>> eng2sp = {'one': 'uno', 'two': 'dos', 'three': 'tres'}
>>> print(eng2sp)
{'one': 'uno', 'three': 'tres', 'two': 'dos'}

键值对的顺序发生了改变,事实上,如果你在你自己的电脑上运行同样的例子,得出的结果可能也不一样,一般而言,字典里面数据项的顺序是不可预测的。

但是,这并不是个问题,因为键值对并不是用整数来索引的,而是用键来查找对应的值。

>>> print(eng2sp['two']) 
'dos'

键two永远隐射着值dos,所以键值对的顺序并不重要。

如果键不在字典中,你会得到下面错误:

>>> print(eng2sp['four'])
KeyError: 'four'

len函数也适用于字典,它返回字典中键值对的个数:

>>> len(eng2sp)
3

in操作符也适用于字典,它可以告诉你,字典中是否存在这个键,不能用来判断是否存在这个值。

>>> 'one' in eng2sp
True
>>> 'uno' in eng2sp
False

要判断字典中是否存在某个值,你可以使用values方法,它返回所有值的一个列表,然后你再用in操作符就可以判断了。

>>> vals = list(eng2sp.values())
>>> 'uno' in vals
True

列表和字典中in操作符的算法实现是不一样的,在列表中,Python采用的是线性搜索策略,搜索时间和列表长度成正比。在字典中,Python使用了一种高效的哈希表算法,这种算法,不管字典里面有多少数据项,时间上话费几乎没有什么差别,这里呢,不展开讲哈希表,请自行Google。

习题 9.1 编写一个程序,读取words.txt文件中的单词,将它们作为键存储在字典中,这里不用关心键对应的值是什么,你随便给吧,然后用in操作符快速判断某一个字符型是否存在于字典中。