字典方法dict.keys(),dict.items()   和dict.values()返回“意见”   而不是列表。    http://docs.python.org/dev/3.0/whatsnew//3.0 html的

首先是如何从一个迭代不同的视图?其次,什么是这种变化的好处?难道仅仅是出于性能的考虑?

这似乎并不直观我,即我所要求的事情列表(给我你所有的键)和我得到别的东西回来。这是否会迷惑人?

有帮助吗?

解决方案

您有效地得到一个列表。这只是不是内部列表的副本,但一些行为,如果它放在一个名单,但只表示内部状态。

这就是它在Java中(也可能是很多其他语言/环境以及)。

相同方式实现

主要的原因是,对于许多用例返回一个完全分离列表是不必要的和浪费的。这将需要复制的全部内容(其可以是或许多不会很多)。

如果您只是想遍历键,然后创建一个新的列表是没有必要的。如果你确实需要它作为一个单独的列表(副本),那么你可以轻松地创建自认为名单。

其他提示

约阿希姆·绍尔的回答解释得非常好,为什么不返回list。但是,这留下为什么这些功能不会返回迭代器的问题,就像iteritems等在Python 2一样。

迭代器是比容器更严格。例如,一个迭代不允许多于一个的通更多;如果你尝试第二次,你会发现它是空的。因此,如elem in cont操作由容器支持,但无法通过迭代器支持:一旦你检查一个元素是否是“在”迭代器,迭代器被破坏

在另一方面,得到的容器的通常需要进行复印,例如,创建的列表出字典的键。

view对象有两全其美的:它表现为一个容器,但不会使字典的副本!这是,事实上,是一种虚拟的只读容器通过链接到底层的字典工作的。如果它看到其他地方的标准Python我不知道。

编辑:

@AntonyHatchkins:它不返回发电机功能的原因是,它不会允许用于快速in操作。是的,in工程发电机的功能(当你给他们打电话)。也就是说,你可以这样做:

def f():
  for i in range(10):
    yield i

5 in f() # True

但根据in的定义,如果右侧是一台发电机,蟒蛇将通过发电机的所有n项目 - 导致O(n)时间复杂度。没有什么可以做,因为这是唯一有意义的行为的任意波形发生器。

在另一方面,在字典视图的情况下,可以实现in你喜欢的任何方式,因为你知道更多关于你的管理数据。而事实上in与使用哈希表的O(1)复杂性来实现。您可以通过运行检查

>>> d = dict(zip(range(50000000), range(50000000)))
>>> 49999999 in d
True
>>> 49999999 in iter(d) # kinda how generator function would work
True
>>>

和注意到第一in有多快相比于第二in

如在相关的问题已经提到,鉴于具有len()方法,该方法迭代缺乏(还列表具有它)。

返回的替代列表视图的另一个好处是,至少对于其具有为O优化的成员测试键(1)操作,而不是O(N)的列表(或迭代)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top