说我有一个词典:
foo = {'a': 1}
list(foo)
和foo.keys()
都返回相同的内容。这两者之间的区别是什么?
答案 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.keys
和list(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