我可以可靠地使用python dictionary key方法生成的列表索引吗?

时间:2014-05-08 01:53:22

标签: python python-2.7 dictionary key

假设我有这本词典:

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],我每次都会获得相同的项目吗?

3 个答案:

答案 0 :(得分:8)

使用词典时,你不应该依赖订购。即使你测试它10亿次并且看起来同质,规范中没有任何东西说它是,因此可能有一些隐藏的代码说“每个满月开始在平日,更改订单“。

如果您想依赖订购,请使用OrderedDict from collections

答案 1 :(得分:2)

  

我的问题是.keys()方法生成的键列表(上面)   我每次打电话都有相同的订单?

如果没有对字典的干预修改,那么订单将是相同的。

引用documentation

  

如果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中可用。+]