-3

Short question: Why when we do list(dict()) the return is the keys of the dict, but not the values? Cause all that I know about (key, value) pairs, is that what matters is the value, not the key. The key it's just a page in a book. Since we don't actually want the page, but the content of that page, giving me the page makes no sense at all at first.

I believe that it, somehow, makes sense. But please, clarify this one.

Thanks!

EDITED: now, since the most relevant part of a (key, value) pair ITS THE VALUE. Why not the the iter method of dict returns the value?

4

3 回答 3

5

认为值是键值对中“最相关的部分”是完全不正确的。这对本身就是相关的。这就是你使用字典的原因。如果您想要的只是这些值,那么您只需使用一个列表。

此外,正如@Blender 正确指出的那样,如果您知道密钥,则可以轻松获得值,而反之则不然。因此,如果您只想获得一个,那么获得密钥而不是价值绝对是有意义的。

尽管in迭代行为确实不一定相关,但对于大多数其他容器类型来说,对容器进行迭代也确实会产生所有且仅item in container会为 true 的项目。我似乎记得曾经在 comp.lang.python 上看到过线程,人们说决定in对字典进行按键操作,并使迭代像 一样工作in,是很久以前做出的,然后为了向后兼容性而维护我现在找不到任何参考资料。

想知道为什么迭代 dict 会产生键而不是键/值对是合理的。但这个问题的答案只是“这就是 dict API 指定它的方式”。迭代键值对(或单独的值,如果涉及的话)非常简单,只需一个方法调用,哪一个是默认行为几乎无关紧要。

于 2013-05-15T04:40:57.270 回答
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中包含值并不存在很好的理由。DICT的实现来自 python 的TimeComplexity数据表明迭代键是并且检索值是,这可能看起来微不足道,直到您意识到迭代和检索给定键的值也是。除非您真的想要键值对(而不是键或值),否则这将是浪费的,因此它不是默认值。__iter__O(n)O(1)O(n)

如果你想让它成为默认值,你可以这样做:

class myDict(dict):
    def __iter__(self):
        return self.iteritems()

并调用list一个实例myDict将为您提供键值对。

于 2013-05-15T04:20:09.183 回答
0

为什么当我们list(dict())返回时是字典的键,而不是值?

首先,doingdict()不会返回任何键或值,而是一个空字典。您正在调用内置dict函数。

如果你在 shell 中准确地输入,你最终会得到一个空的 list []

顺便说一句,你也不能这样做:

d = {'a': 1, 'b': 2}
list(d())

这将引发 aTypeError因为字典对象不可调用。

默认情况下,如果您遍历字典,由于其实现,默认迭代器将返回键。这是您问题的直接答案。这种实现的原因是,在 Python 中,只有一种类型可以通过任何可散列类型来检索值,那就是字典。因此,这种类型的主要用例是通过键检索项目,键可以是任意值。此外,由于字典是无序的,因此轻松访问键是最简单的方法,我认为这是使用字典的主要原因。否则,列表有什么问题?还是元组?


如果您有一本字典并且想要将其转换为列表,则需要以某种方式“展平”字典。这是因为列表已经有一个索引为 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提供排序字典的模块中。

于 2013-05-15T04:35:47.187 回答