python:list(dict)和dict.keys()之间的区别?

时间:2015-08-05 15:48:02

标签: python

说我有一个词典:

foo = {'a': 1}

list(foo)foo.keys()都返回相同的内容。这两者之间的区别是什么?

5 个答案:

答案 0 :(得分:10)

一个区别在于Python 3. foo.keys()返回键的迭代器,这是{2}在Python 2中的作用,而foo.iterkeys()返回键的列表。

如下所述,list(foo)并不完全返回Python 3中的迭代器。它返回一个foo.keys()对象(或视图),在其操作中允许迭代。您还可以做有趣的事情,例如设置操作和多次迭代。它仍然具有惰性求值的概念,这使得迭代器如此强大。

答案 1 :(得分:3)

python 2没有什么区别,这就是为什么我怀疑dict.keys更改为在python3中返回一个视图而dict.viewkeys被删除了。

在python 3中:

In [3]: foo = dict((k,k) for k in range(4))

In [4]: foo
Out[4]: {0: 0, 1: 1, 2: 2, 3: 3}

In [5]: foo.keys?
Type:        builtin_function_or_method
String form: <built-in method keys of dict object at 0x7f45d8667708>
Docstring:   D.keys() -> a set-like object providing a view on D's keys

In [6]: foo.keys()
Out[6]: dict_keys([0, 1, 2, 3])

In [7]: type(foo.keys())
Out[7]: dict_keys

In [8]: for i in foo.keys():
   ...:     del foo[i]
   ...:     
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-659d5446ab29> in <module>()
----> 1 for i in foo.keys():
      2     del foo[i]
      3 

RuntimeError: dictionary changed size during iteration

In [9]: for i in list(foo):
    del foo[i]

In [10]: foo
Out[10]: {}

最后两件事基本上是你需要知道的关于python 3 dict.keyslist(dictionary)之间差异的事情。 dict.keys 只是键的视图,因此检查item in dictionary.keys()是O(1),但是您无法迭代dictionary.keys()并修改字典同时。

它们都是迭代器,因为它们都实现了__iter__

答案 2 :(得分:3)

Python3:

来自官方documentation

  

调用foo.keys()将返回一个字典视图对象。它支持   会员测试和迭代等操作,但其内容是   不独立于原始字典 - 它只是一种观点。

事实上,

type(foo.keys())

给出

<class 'dict_keys'>

而在Python 2中都是

type(list(foo))
type(foo.keys())

<type 'list'>

答案 3 :(得分:0)

在Python 3中,由dict_keys返回的.keys()对象仅指向实际的字典键(并且在更改字典时也会更改),而list命令创建一个副本键。 因此,dict_keys更轻便,更快。在对字典的键进行迭代的同时修改字典时,应使用list。字典foo的一个有点荒谬的示例:

>>> for kw in foo.keys():
...   foo.pop(kw)

通向RuntimeError: dictionary changed size during iteration,而以下工作有效:

>>> for kw in list(foo):
...   foo.pop(kw)

答案 4 :(得分:-1)

df <- structure(list(Species = c("Species 1", "Species 2", "Species 3", 
                                 "Species 4", "Species 5", "Species 6"), Leaf.trait.1 = c(0L, 
                                                                                          0L, 1L, 1L, 0L, 1L), Leaf.trait.2 = c(1L, 1L, 1L, 0L, 0L, 1L), 
                     Leaf.trait.3 = c(0L, 0L, 0L, 1L, 1L, 0L), Flower.trait.1 = c(0L, 
                                                                                  0L, 0L, 0L, 1L, 1L), Flower.trait.2 = c(0L, 0L, 0L, 1L, 1L, 
                                                                                                                          0L)), row.names = c("1", "2", "3", "4", "5", "6"), 
                class = "data.frame")
library(tidyverse)

pivot_longer(
  data = df, 
  cols = -Species, 
  names_to = c(".value", "set"), 
  names_pattern = "(.+)\\.(\\d+)"
) %>% 
  group_by(Species) %>% 
  summarise(across(ends_with("trait"), max, na.rm = T))
#> # A tibble: 6 x 3
#>   Species   Leaf.trait Flower.trait
#>   <chr>          <int>        <int>
#> 1 Species 1          1            0
#> 2 Species 2          1            0
#> 3 Species 3          1            0
#> 4 Species 4          1            1
#> 5 Species 5          1            1
#> 6 Species 6          1            1