将dict转换为列表可以清除值

时间:2013-05-15 04:02:17

标签: python list dictionary

简短问题:为什么当我们列出(dict())时,返回是dict的键,而不是值? 因为我所知道的(关键,值)对,重要的是价值,而不是关键。关键它只是书中的一页。因为我们实际上并不想要页面,而是页面的内容,所以一开始就没有任何意义。

我相信它在某种程度上是有道理的。但是,请澄清一下。

谢谢!

编辑: 现在,由于(关键,价值)最相关的部分对其价值。为什么dict的 iter 方法返回值?

3 个答案:

答案 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模块,该模块提供已排序的词典。