我正在尝试从一些教程中学习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()从字典中提取密钥并按照我认为的顺序迭代它,会导致不匹配问题吗?
答案 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)
答案 6 :(得分:0)
一般来说,词典没有排序。它们按键/值对分组。它们通常是快速的,因为它们是哈希映射的。如果您知道密钥,您可以快速获得其价值。
例如,如果你想获得服务器的价值,那么就可以做到这一点
d ['server']你会得到答案......