我正在从Dive Into Python运行此代码:
def buildConnectionString(params):
"""Build a connection string from a dictionary of parameters.
Returns string."""
return ";".join(["%s=%s" % (k, v) for k, v in params.items()])
if __name__ == "__main__":
myParams = {"server":"mpilgrim", \
"database":"master", \
"uid":"sa", \
"pwd":"secret" \
}
print buildConnectionString(myParams)
这本书说它的输出应该是:
server=mpilgrim;uid=sa;database=master;pwd=secret
但是当我运行它时,反过来出现了:
pwd=secret;database=master;uid=sa;server=mpilgrim
任何想法为什么?
答案 0 :(得分:7)
它完全相反的顺序实际上只是一个巧合。使用不同的python版本/实现运行代码,您可能会得到不同的顺序。这是因为在python词典中没有排序,所以函数输出的顺序没有明确定义。 (将字符放入字典的顺序不是迭代字典时产生的顺序)。
如果您需要特定订单,可以使用内置parames.items()
功能对sorted
进行排序(可选择使用key
关键字告诉sorted
如何对项目进行排序)。另一种选择是使用python2.7中出现的collections模块中的OrderedDict(如sr2222所指出的那样)。
答案 1 :(得分:3)
因为您正在打印字典,所以字典是无序的。迭代字典的顺序取决于许多因素,包括解释器类型,解释器版本和OS。如果您希望它与您输入的顺序相同,则必须使用collections.OrderedDict
。或者,正如mgilson在他的回答中所说,你可以在打印之前对字典内容进行排序,但鉴于你想要的顺序不是按字母顺序排列的,它可能比它的价值更麻烦。