dict.viewkeys()返回的数据类型是什么? [python 2.7]

时间:2014-04-06 05:04:24

标签: python python-2.7

我今天正在研究dict.viewkeys(),我发现我的python称它为dict_keys个对象。我可以将它作为一个可迭代的处理,但它不是一个生成器,因为我可以多次迭代它。

据我所知,我只知道一些数据类型,如String,int,float,list,dict,tuple,set。

但昨天我了解到enumerate()只返回一对特殊的数据,dict()只能使用一次,因此它是一个特殊的元组生成器(index_of_iteration, item)

dict_keys对象是否是另一个"我不知道它到底是什么,但我知道如何使用它" python中的对象类型,还是别的什么?

2 个答案:

答案 0 :(得分:8)

它返回一个字典视图对象(https://docs.python.org/2/library/stdtypes.html#dictionary-view-objects)。

这是字典中元素的动态视图。即如果您查看字典中的键,如果从字典中删除键,它也将从视图中删除。请参阅以下示例。

来自文档:

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

>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
>>> print(n)
504

>>> # keys and values are iterated over in the same order
>>> list(keys)
['eggs', 'bacon', 'sausage', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['spam', 'bacon']

>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}

另见:What are Python dictionary view objects?

答案 1 :(得分:3)

如果你进入shell:

print type(dct.viewkeys())

它将返回:

<type 'dict_keys'>

dict_keysDictionary view对象,是Python 2.7中的新对象。

来自PEP 3106:

  

字典方法keys(),values()和items()在Python 3.x中是不同的。它们返回一个名为view的对象,而不是一个完全具体化的列表。

     

在Python 2.7中无法更改keys(),values()和items()的返回值,因为太多代码会中断。而是在新名称viewkeys(),viewvalues()和viewitems()下添加了3.x版本。

>>>
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])

视图是可迭代的,但键视图和项视图也表现得像集合; &安培;执行交集,和|执行联盟:

>>>
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])

视图会跟踪字典,并在修改字典时更改其内容:

>>>
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])

但请注意,在迭代视图时无法添加或删除键:

>>>
>>> for k in vk:
...     d[k*2] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration