字典实战——示例:电影数据库——预览:将值映射到键 | 第二部分 类型与操作 —— 第 8 章: 列表和字典 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-金年会app官方网
注意前一个表格式如何将年份映射到名称的,但反过来却不行。如果想反方向映射——名称到年份——可以不同地编码字典,或使用像items
那样给出可搜索序列的方法,然而要使用它们达到最佳效果,需要比目前掌握更多的背景信息:
>>> table = {'holy grail': '1975', # key=>value (title=>year)
... 'life of brian': '1979',
... 'the meaning of life': '1983'}
>>>
>>> table['holy grail']
'1975'
>>> list(table.items()) # value=>key (year=>title)
[('the meaning of life', '1983'), ('holy grail', '1975'), ('life of
brian', '1979')]
>>> [title for (title, year) in table.items() if year == '1975']
['holy grail']
这里最后一个命令在一定程度上是第4章中引入和第14章详细讲述的comprehension语法。简言之,它扫描了字典的被items()
方法返回的(key, value)
元组对,选择拥有指定值的键。最终效果是反向索引——从值到键,而非从键到值——如果只想存储一次数据并很少后向映射,这是很有用的(搜索像这样的序列通常被直接的键索引要慢得多)。
事实上,虽然字典本质上是单向地映射键到值,但使用一点额外的通用代码就可以有多种方法来将值映射回键:
>>> k = 'holy grail'
>>> table[k] # key=>value (normal usage)
'1975'
>>> v = '1975'
>>> [key for (key, value) in table.items() if value == v] # value=>key
['holy grail']
>>> [key for key in table.keys() if table[key] == v] # ditto
['holy grail']
注意最后两个命令都返回名称的列表:在字典中,每个键只有一个值,但每个值却可能有多个键。一个指定值可能存储在多个键下(每个值产生多个键),且一个值本身就是一个集合(每个键支持多个值)。关于这个预览的更多知识,还请关注第32章中的mapattrs.py
示例中的字典反转函数——如果把其代码包括在这里,肯定会让这个预览超出其极限而难以理解。为达到本章的目的,让我们探索更多字典的基础知识。