字典实战——在Python 3.X 和 2.7 中的字典改变——在3.X中的字典视图(和2.7中通过新方法)

未匹配的标注

在3.X中,字典的keysvaluesitems方法都返回视图对象,然而在2.X中它们返回真正的结果列表。这个功能在2.7中也有,但是以特殊的伪装形式——在本节开始列出的不同的方法名称(2.7的普通方法仍返回简单的列表,这样是为了避免破坏现存的2.X代码);因此,将把这个作为本节的3.X特性。

视图对象是可迭代的,这仅仅意味着一次产生一个结果项的对象,而不是一次性在内存中生成所有结果列表。除了是可迭代的,字典视图还保留了字典组件的原来的顺序,反映了对字典的更改,且可能支持set操作。另一方面,因为它们不是列表,所以不直接支持如索引或列表的sort方法,当打印时也不作为普通列表显示其项目(它们从3.1开始确实显示它们的组件,但不作为列表,而且仍是和2.X的一个差异)。

将在第14章更正式地讨论可迭代的概念,但就这里的目的而言,如果想应用列表操作或显示它们的值,知道必须将这三个方法的结果通过list内置方法运行就足够了。比如,在3.3(其它版本的输出可能稍有不同):

>>> D = dict(a=1, b=2, c=3)
>>> D
{'b': 2, 'c': 3, 'a': 1}
>>> K = D.keys() # Makes a view object in 3.X, not a list
>>> K
dict_keys(['b', 'c', 'a'])
>>> list(K) # Force a real list in 3.X if needed
['b', 'c', 'a']
>>> V = D.values() # Ditto for values and items views
>>> V
dict_values([2, 3, 1])
>>> list(V)
[2, 3, 1]
>>> D.items()
dict_items([('b', 2), ('c', 3), ('a', 1)])
>>> list(D.items())
[('b', 2), ('c', 3), ('a', 1)]
>>> K[0] # List operations fail unless converted
TypeError: 'dict_keys' object does not support indexing
>>> list(K)[0]
'b'

除了交互式提示符处的结果显示,甚至将很可能很少注意到这个变化,因为Python中的循环结构自动强制迭代对象为每次迭代产生一个结果:

>>> for k in D.keys(): print(k) # Iterators used automatically in loops
...
b
c
a

另外,3.X的字典本身仍有迭代器,它返回连续的键——如在2.X中一样,仍常没必要直接调用keys

>>> for key in D: print(key) # Still no need to call keys() to iterate
...
b
c
a

然而,不像2.X的列表结果,在3.X中的字典视图在创建时并不是不变的——在视图对象被创建后它们动态地反映了对字典进行的未来的改变

>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> D
{'b': 2, 'c': 3, 'a': 1}
>>> K = D.keys()
>>> V = D.values()
>>> list(K) # Views maintain same order as dictionary
['b', 'c', 'a']
>>> list(V)
[2, 3, 1]
>>> del D['b'] # Change the dictionary in place
>>> D
{'c': 3, 'a': 1}
>>> list(K) # Reflected in any current view objects
['c', 'a']
>>> list(V) # Not true in 2.X! - lists detached from dict
[3, 1]

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

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


暂无话题~