5.1.2 字典的基本操作
不同于序列中的列表、字符串等,字典有着特有的基本操作——有的在形式上与列表近似。
1. 键值对数量
Python 内置函数 len()
能够返回字符串、列表和元组——都是序列——中的成员数量,且在第4章4.2.3节阅读过它的帮助文档,其中明确指出:“Return the number of items in a container”。毫无疑问,字典是 “container”,所以可以作为 len()
的参数,并返回字典中的成员数量,即键值对的数量。
>>> cities_phone = {"soochow": "0512", "shanghai": "021", "hangzhou": "0571"}
>>> len(cities_phone)
3
字典中键值对的数量,通俗地说,就是“字典的长度”。
2. 键值对的读写
如果从数学角度来理解字典中的“键”和“值”之间的对应关系,可称之为是“映射”,且属于“单射”,即 rm{key}torm{value} ,反之不一定成立(关于“映射”的概念,参阅拙作《机器学习数学基础》)。其实,将“映射”的概念也可以用于列表、元组和字符串,它们的索引和成员之间的对应关系也是映射,且可以认为是“双射”,即“一一对应”。由此总结,不论是之前的序列中的索引与成员之间,还是现在的键值对中的键与值之间,都存在着 index/key to value 的关系。在序列类对象中,通过索引读取到对应的成员,使用了 []
符号,既然字典与它们存在上述一样的映射关系,符号 []
也可用于字典中,通过“键”读取相应的“值”。
>>> cities_phone['soochow']
'0512'
除了“读取”之外,还可以通过键修改值。
代码语言:javascript复制>>> cities_phone['shanghai'] = '011'
>>> cities_phone
{'soochow': '0512', 'shanghai': '011', 'hangzhou': '0571'}
以上操作,跟列表中通过索引读取成员、修改成员的操作在形式上很类似。但是,下面的就不同了:
代码语言:javascript复制>>> cities_phone['beijing'] = '010' # (3)
>>> cities_phone
{'soochow': '0512', 'shanghai': '011', 'hangzhou': '0571', 'beijing': '010'}
原来的字典 cities_phone
没有键值对 'beijing': '010'
,现在用注释(3)的方式,为它增加了这个键值对——列表中能用类似的形式增加成员吗?试一试便知:
>>> lst = [1, 2, 3]
>>> lst[4] = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
再思考一个问题,执行了注释(3)之后,字典 cities_phone
的内存地址是否变化了?也就是变量 cities_phone
所引用的对象还是不是先前的?读者应该能自行回答此问题——答案:执行注释(3)后字典原地修改。
3. 成员检测
在字符串、列表的基本操作中,使用关键词 in
可以检测其中是否有某个成员(参阅第4章4.2.3节)。对于字典,其成员是键值对,如前所述,键值对是以键作为唯一标识——键不可重复,所以,只要判断键是否在字典中,即可实现成员检测。
>>> cities_phone
{'soochow': '0512', 'shanghai': '011', 'hangzhou': '0571', 'beijing': '010'}
>>> 'hangzhou' in cities_phone
True
>>> 'suzhou' in cities_phone
False
★自学建议 读者细心体会一番上述学习过程,不断地将字典和列表进行对比,从而发现它们的异同。在比较中,不难体会到编程语言中各种规则的设计是非常符合逻辑的,比如“
[ ]
”符号在列表、字典等对象中应用的原因。这种逻辑还可以推广到更大范围,凡是操作 Python 对象中的成员,都应该用“[ ]
”符号。Numpy 中的数组对象、Pandas 中的 DataFrame 对象都如此(关于 Numpy 和 Pandas ,参阅第12章12.4节)——若不如此,才是“反 Python”的。 由此,就提示我们要掌握一种重要的自学方法:比较。将现在学习的知识,与已经掌握的知识进行对比,找出异同,重点理解差异之处,这样就能快速掌握一种新的知识。如果你已经完全掌握了一种编程语言,比如 Python ,再学习另外一种编程语言,遵循此方法,会学得非常快。所以,学得越多学得越快。如此,“老年”程序员依然可以“老夫聊发少年狂”。 ”