订购的dict也按顺序返回键吗?

时间:2016-04-05 13:44:18

标签: python

例如:

my_dict = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

如果获得了获取密钥的操作,即my_dict.keys()my_dict.iterkeys(),则保证返回: ['apple','banana','orange','pear']

文档中未明确提及。

3 个答案:

答案 0 :(得分:3)

是的,所有次迭代都保证使用相同的顺序。

如果他们没有,那将是一个非常大的例外,必须明确记录。该文档不包含此类例外。

您始终可以查看从模块文档顶部明确链接的implementation。您需要注意的是,所有方法实现都使用self上的迭代,直接或通过iter(self)list(self);所有这些都由OrderedDict.__iter__方法提供,它按顺序生成密钥:

def __iter__(self):
    'od.__iter__() <==> iter(od)'
    # Traverse the linked list in order.
    root = self.__root
    curr = root[1]                                  # start at the first node
    while curr is not root:
        yield curr[2]                               # yield the curr[KEY]
        curr = curr[1]                              # move to next node

例如,OrderedDict.values()方法使用这些键映射到值:

def values(self):
    'od.values() -> list of values in od'
    return [self[key] for key in self]

答案 1 :(得分:1)

是的,OrderedDict将按顺序返回密钥。然而,值得一提的是,the keys views compare order insensitive有点令人惊讶。

以下是__iter__的{​​{3}},.keys.iterkeys两种方法都将委派给:{/ p>

def __iter__(self):
    'od.__iter__() <==> iter(od)'
    # Traverse the linked list in order.
    root = self.__root
    curr = root[1]                                  # start at the first node
    while curr is not root:
        yield curr[2]                               # yield the curr[KEY]
        curr = curr[1]                              # move to next node

self.__root只是一个列表。

注意:实际实现是在C代码中。

答案 2 :(得分:1)

简答:是的

更长的答案:

密钥(以及值)方法的实现基于__iter__方法,即“按顺序遍历链表”。

    def keys(self):
        return list(self)

    def values(self):
        return [self[key] for key in self]

您可以查看source code中链接的documentation