用于查看Python词典

时间:2017-09-18 10:27:03

标签: python dictionary

在阅读What are Python dictionary view objects?… what are the performance tradeoffs …?以及有关Python词典视图的官方文档后,我仍然缺乏一个像样的用例,这让我理解为什么他们在那里。

这个想法是在字典上有一个视图,它与创建键/值/项目列表有两个主要区别:①创建速度更快(在恒定时间内)并且具有恒定的内存占用量②它反映了词典创作后的变化。

这很好并且理解但我不知道什么时候有这个有用。 毕竟无论我在哪里传递这样的视图,我都可以通过字典本身。它也会在没有额外内存占用的情况下以恒定时间传递,它也会反映自身的变化(当然)。无论我想对视图做什么,我也可以使用传递的字典本身。或者我错过了什么?

有人提到在字典改变时在字典上使用iteritems()(Python3中的iter())会使迭代器无效。这是真的。不幸的是,对于为迭代视图而创建的任何迭代器也是如此。所以再没有区别。

那么使用视图的好处是什么?是否有任何实用的用例超出了上面链接的旧问题中的内容?

1 个答案:

答案 0 :(得分:1)

以下是official documentation,而PEP 3106是受Java Collections Framework启发的提案。

字典视图由Python 3中的dict.keys()dict.values()dict.items()返回。反向移植到Python 2.7,您必须直接调用dict.viewkeys()dict.viewvalues()dict.viewitems()

字典视图可以像dicts一样迭代,并且它们增加了内存改进,因为它们在迭代时不构建列表。这些津贴很微妙,并且融入了语言。

一个直接用例来自字典键视图设置类似

来自文档:

dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
keys = dishes.keys()

keys & {'eggs', 'bacon', 'salad'}
# {'bacon'}

keys ^ {'sausage', 'juice'}
# {'juice', 'sausage', 'bacon', 'spam'}

除了正常的设置操作外,此行为还简化了两个字典是否共享公共密钥的测试。

见Brandon Rhodes'关于此主题的PyCon 2017 talk, The Dictionary Even Mightier