简短问题:为什么当我们列出(dict())时,返回是dict的键,而不是值? 因为我所知道的(关键,值)对,重要的是价值,而不是关键。关键它只是书中的一页。因为我们实际上并不想要页面,而是页面的内容,所以一开始就没有任何意义。
我相信它在某种程度上是有道理的。但是,请澄清一下。
谢谢!
编辑: 现在,由于(关键,价值)最相关的部分对其价值。为什么dict的 iter 方法返回值?
答案 0 :(得分:5)
这个值是键值对中“最相关的部分”,这是不正确的。这对本身就是相关的。这就是你使用dict的原因。如果您想要的只是值,那么您只需使用一个列表。
另外,正如@Blender正确指出的那样,如果你知道密钥,你就可以很容易地获得价值,而反之则不然。因此,如果你只想获得一个,那么获得关键而不是价值肯定是有意义的。
尽管in
和迭代行为不一定是链接的,但对于大多数其他容器类型而言,迭代容器会产生所有且仅item in container
为真的项目,这也是事实。 。我似乎记得在comp.lang.python上看到线程,在这一点上,人们说决定使字典上的in
按键工作,并使迭代工作像in
一样,时间以前,然后保持向后兼容性,虽然我现在找不到任何参考。
有理由怀疑为什么迭代overa dict产生键而不是键/值对。但答案就是“这就是dict API指定它的方式”。迭代键值对(或单独的值,如果涉及到这一点)是非常简单的,只需一个方法调用,几乎不重要哪一个是默认行为。
答案 1 :(得分:1)
发生这种情况的原因是因为list
接受迭代器,并通过调用它上的iter
来使用每个项目就好像它是迭代器一样。由于__iter__
类型的dict
方法在其键上返回迭代器,因此在list
对象上调用dict
会为您提供密钥。
>>> class A(object):
def __init__(self,lst):
self.lst = lst
def __iter__(self):
print 'iter on A'
return iter(self.lst)
>>> a = A(range(10))
>>> list(a)
iter on A
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
在实现方面,只返回键比返回两者更快,并且由于它们明确包含items
方法,因此不存在将值包含在默认值{{1}中的非常好的理由实现。 Implementation of DICT来自python的TimeComplexity数据表明迭代键是__iter__
并且检索值是O(n)
,这可能看起来微不足道,直到您意识到迭代并检索给定键的值也是O(1)
。这将是浪费,除非你真的想要键,值对(而不仅仅是键,或只是值),所以它不是默认值。
如果您希望它是默认值,您可以这样做:
O(n)
并在class myDict(dict):
def __iter__(self):
return self.iteritems()
的实例上调用list
会为您提供键值对。
答案 2 :(得分:0)
为什么当我们
list(dict())
返回时是dict的关键,但是 不是价值观?
首先,执行dict()
不会返回任何键或值,而是返回一个空字典。您正在调用内置的dict
函数。
如果您在shell中输入完全相同的内容,则最终会得到一个空列表[]
。
顺便说一下,你也做不到:
d = {'a': 1, 'b': 2}
list(d())
这将引发TypeError
,因为字典对象不可调用。
默认情况下,如果循环遍历字典,由于其实现,默认迭代器将返回键。这是您问题的直接答案。这种实现的原因是在Python中,只有一个类型可用于通过使用任何hashable类型来检索值,这是一个字典。因此,此类型的主要用例是通过其键检索项目,该键可以是任意值。此外,由于字典是无序的,因此可以轻松访问密钥是最简单的方法,我认为主要原因甚至可以使用字典。否则,列表有什么问题?还是元组?
如果您有一本字典,并且想要将其转换为列表,则需要以某种方式“压扁”字典。这是因为列表已经有一个0索引键,我相信你已经知道了。
要让list(somedict)
创建任何字典的值列表,您可以通过以下几种方式。
评论中暗示的第一个;并且是最直接的方式:
list({'a': 1, 'b': 2}.values())
如果你想在它上面添加一些语法糖,但这只是愚蠢的:
d = {'a': 1, 'b': 2}.values
list(d())
最后,如果您想在列表中同时拥有键和值,则可以执行以下操作:
list({'a': 1, 'b': 2}.values())
[('a', 1),('b', 2)]
现在你有一个元组列表,每个元组代表一个键/值对。一些开发人员使用它来对字典进行排序,因为字典在Python中未排序。在Python 2.7中,OrderedDict
被添加到collections
模块,该模块提供已排序的词典。