字典实战——更多的字典方法

未匹配的标注

字典方法提供了许多特定类型的工具。比如,字典的 valuesitems 方法分别返回所有的字典值和(key,value)成对元组;还有keys一起,这些在需要逐个遍历字典条目的循环中非常有用(将在下一节开始编码这些循环的例子)。和keys一样,在 3.X 中这两个方法也返回可迭代的对象,所以将它们包裹在一个list调用中来一次性手机它们的值用于显示:

>>> D = {'spam': 2, 'ham': 1, 'eggs': 3}
>>> list(D.values())
[3, 2, 1]
>>> list(D.items())
[('eggs', 3), ('spam', 2), ('ham', 1)]

在当程序运行时搜集数据的现实程序中,通常不能在程序启动前预测字典中将是什么,更不用说在编码的时候了。

获取一个不存在的键通常是一个错误,但 get方法返回一个默认值——None,或一个传入的默认值——如果这个键不存在的话。这是当程序不能提前预测内容时,为不存在的键填入默认值,并避免缺失键的错误的简单方法:

>>> D.get('spam') # A key that is there
2
>>> print(D.get('toast')) # A key that is missing
None
>>> D.get('toast', 88)
88

update方法提供了类似于字典的连接操作的东西,然而它与从左到右的顺序无关(再说一次,在字典中没有这种东西)。它将一个字典中的键和值合并到另一个,如果有冲突就盲目地覆盖相同键的值:

>>> D
{'eggs': 3, 'spam': 2, 'ham': 1}
>>> D2 = {'toast':4, 'muffin':5} # Lots of delicious scrambled order here
>>> D.update(D2)
>>> D
{'eggs': 3, 'muffin': 5, 'toast': 4, 'spam': 2, 'ham': 1}

注意在最后一个结果中键顺序是如何混合的;再说一次,这只是字典是如何工作的。最后,字典的 pop方法从字典删除一个键并返回它拥有的值。这类似于列表的pop方法,但它传入的是一个键而非可选的位置:

# pop a dictionary by key
>>> D
{'eggs': 3, 'muffin': 5, 'toast': 4, 'spam': 2, 'ham': 1}
>>> D.pop('muffin')
5
>>> D.pop('toast') # Delete and return from a key
4
>>> D
{'eggs': 3, 'spam': 2, 'ham': 1}
# pop a list by position
>>> L = ['aa', 'bb', 'cc', 'dd']
>>> L.pop() # Delete and return from the end
'dd'
>>> L
['aa', 'bb', 'cc']
>>> L.pop(1) # Delete from a specific position
'bb'
>>> L
['aa', 'cc']

字典还提供了copy方法;将在第9章复习它,因为它是避免对同一字典共享引用的潜在副作用的一种方法。事实上,字典拥有的方法比表8-2中列出的更多;请参见Python库手册,dirhelp,或其它引用资源来获取一个完整的列表。


注意

你的字典属性可能不同:如果你的字典打印结果和这里显示的不同,不要担心。如提到的,键顺序是任意的,而且在每个版本、平台,交互式会话(在Python 3.3中)都可能不同(而且在一周中的每天甚至不同的月相也可能不同!)

本书中大部分字典示例都反映了3.3中的键顺序,但它从3.0开始和之前已经改变过了。你的Python的键可能不同,但你不管怎样都不应该去关心它:字典是被键处理的,而非位置。程序不应该依赖于字典中键的任意顺序,即使是在本书中显示的顺序。

在Python的标准库中有维护键之间的插入顺序的扩展类型——参见集合模块中的OrderedDict——但他们是为达到额外功能而导致额外空间和速度开销的混合体,且不是真正的字典。简言之,键被冗余地保存在一个链接列表中来支持系列操作。

第9章中将看到:这个模块还实现了一个允许元组项目被属性名称和序列位置所访问的命名元组——一种元组/类/字典的混合体,它添加了处理步骤且不管怎样都不是核心对象类型。Python的库手册有关于这些和其它扩展类型的完整故事。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~