假设我有这本词典:
mydict = {'1': ['a', 'b', 'c'],
'2': ['d', 'e', 'f'],
'3': ['g', 'h', 'i'],
'4': ['j', 'k', 'l'],
'5': ['m', 'n', 'o']}
根据Python文档,
字典对象的keys()方法返回所有的列表 字典中使用的键,按任意顺序
当我调用mydict.keys()
方法时,它会在mydict
中为我提供一个键列表,而不会有任何特定的顺序:
['1','3','2','5','4']
我的问题是.keys()
方法生成的密钥列表(上面)每次调用它时都有相同的顺序吗?我尝试使用for循环这样:
for i in range(100):
print mydict.keys()
在我看来,结果列表始终具有相同的顺序。但我只是想确认没有隐藏的情况会改变输出列表的顺序。
换句话说,如果我使用mydict.keys()[0]
,我每次都会获得相同的项目吗?
答案 0 :(得分:8)
使用词典时,你不应该依赖订购。即使你测试它10亿次并且看起来同质,规范中没有任何东西说它是,因此可能有一些隐藏的代码说“每个满月开始在平日,更改订单“。
如果您想依赖订购,请使用OrderedDict
from collections
。
答案 1 :(得分:2)
我的问题是.keys()方法生成的键列表(上面) 我每次打电话都有相同的订单?
如果没有对字典的干预修改,那么订单将是相同的。
如果
items()
,keys()
,values()
,iteritems()
,iterkeys()
和 调用itervalues()
而不对其进行干预修改 字典,列表将直接对应。这允许 使用(value, key)
创建zip(): pairs = zip(d.values(), d.keys())
对。同样的关系适用于iterkeys()
和。{itervalues()
方法:pairs = zip(d.itervalues(), d.iterkeys())
为对提供相同的值。另一种创建相同列表的方法 是pairs = [(v, k) for (k, v) in d.iteritems()]
。
答案 2 :(得分:0)
简短的回答是否定的,你不能依赖订单。 原因是键被散列并相应地放在表中。只要字典是2/3满(我认为这是数字)就可以调整表的大小,以避免太多的冲突并保持O(1)访问时间,并调整下来(我认为当它是1/3满),以管理内存利用率。
因为它是一个哈希表,所以构造字典的顺序将影响键的顺序。 散列函数可能会在将来的版本中更改...
如果您需要以可靠的顺序使用密钥,您可以查看集合OrderedDict ,这可能就是您要查找的内容。 [编辑:我刚注意到你使用的是python 2.7,OrderedDict仅在Python 3中可用。+]