我今天正在研究dict.viewkeys()
,我发现我的python称它为dict_keys
个对象。我可以将它作为一个可迭代的处理,但它不是一个生成器,因为我可以多次迭代它。
据我所知,我只知道一些数据类型,如String,int,float,list,dict,tuple,set。
但昨天我了解到enumerate()
只返回一对特殊的数据,dict()
只能使用一次,因此它是一个特殊的元组生成器(index_of_iteration, item)
值
此dict_keys
对象是否是另一个"我不知道它到底是什么,但我知道如何使用它" python中的对象类型,还是别的什么?
答案 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'}
答案 1 :(得分:3)
如果你进入shell:
print type(dct.viewkeys())
它将返回:
<type 'dict_keys'>
dict_keys
是Dictionary 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