字典实战——在python 3.x 和 2.7 中的字典改变——在3.x中的字典视图(和2.7中通过新方法) | 第二部分 类型与操作 —— 第 8 章: 列表和字典 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载

未匹配的标注

在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]

本文章首发在 大发黄金版app下载 网站上。

上一篇 下一篇
讨论数量: 0



暂无话题~
网站地图