为什么字典中的项目顺序在Python中发生了变化?

时间:2013-11-25 12:20:50

标签: python dictionary

我正在尝试从一些教程中学习Python。这是我遇到的一个简单的例子让我困惑。

>>> d={"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}

>>> d
{'pwd': 'secret', 'database': 'master', 'uid': 'sa', 'server': 'mpilgrim'}

>>> d.keys()
['pwd', 'database', 'uid', 'server']

>>> d.values()
['secret', 'master', 'sa', 'mpilgrim']

正如您在我定义字典的第一行中所看到的,项"pwd":"secret"是字典中的最后一个元素。但是,当我输出字典时,它成为第一个元素。字典的其余部分已经重新排序。

我可以知道为什么会这样吗?

如果我使用dict.keys()从字典中提取密钥并按照我认为的顺序迭代它,会导致不匹配问题吗?

7 个答案:

答案 0 :(得分:6)

  

我可以知道为什么会这样吗?

这是因为dicts的内部组织方式。

简而言之,这可以通过哈希表来实现,哈希表根据hash()值将密钥放入桶中。

  

如果我使用dict.keys()从字典中提取密钥并按照我认为的顺序迭代它,那会导致不匹配问题吗?

取决于你的工作方式。

k = list(d.keys())
k.sort()
for i in k: print i, d[i]

应该按照您希望的方式运作。

答案 1 :(得分:2)

您需要担心的是,您获得的价值与否对应,并由dict保证。

d={"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
for k, v in d.items():
    print k, v

<强>输出

pwd secret
database master
uid sa
server mpilgrim

注意:如果您确实希望键的顺序可预测,请将PYTHONHASHSEED环境变量设置为[0,4294967295]范围内的整数值。引自python --help

  

PYTHONHASHSEED:如果此变量设置为'random',则效果为   与指定-R选项相同:随机值用于种子   str,bytes和datetime对象的哈希值。它也可以设置   到[0,4294967295]范围内的整数,以获取带有a的哈希值   可预测的种子。

答案 2 :(得分:2)

如果您想维护广告订单,可以使用OrderedDict。但是常规的dict对象通过散列键来存储值,并将其用于查找,这不会保持顺序,但会使查找更快。

答案 3 :(得分:1)

字典没有排序!使用键值获取所需的项目。

答案 4 :(得分:1)

这是因为词典没有排序。你不能以任何方式影响键序。有Collections.OrderedDict来维护广告订单。

答案 5 :(得分:0)

  

我可以知道为什么会这样吗?

这是因为Python的字典没有预定义的顺序。把它想象成一个键值商店。并且不要指望键和值的精确排序。

如果您需要在字典中进行排序,您可以做的就是使用OrderedDict

答案 6 :(得分:0)

一般来说,词典没有排序。它们按键/值对分组。它们通常是快速的,因为它们是哈希映射的。如果您知道密钥,您可以快速获得其价值。

例如,如果你想获得服务器的价值,那么就可以做到这一点

d ['server']你会得到答案......