例如:
my_dict = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
如果获得了获取密钥的操作,即my_dict.keys()
或my_dict.iterkeys()
,则保证返回:
['apple','banana','orange','pear']
?
文档中未明确提及。
答案 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: