【问题标题】:What's the data type returned by dict.viewkeys()? [ python 2.7 ]dict.viewkeys() 返回的数据类型是什么? [蟒蛇2.7]
【发布时间】:2014-05-18 09:13:53
【问题描述】:

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

以我有限的知识,我只知道String、int、float、list、dict、tuple、set等几种数据类型。

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

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

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    如果进入shell:

    print type(dct.viewkeys())
    

    它会返回:

    <type 'dict_keys'>
    

    dict_keys 是一个 Dictionary view 对象,是 Python 2.7 中的新对象。

    来自 PEP 3106:

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

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

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

    【讨论】:

      【解决方案2】:

      它返回一个字典视图对象 (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?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 2020-06-05
        • 2017-08-17
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 2013-03-05
        相关资源
        最近更新 更多