深入研究Python输出错误

时间:2012-07-30 13:41:16

标签: python

我正在从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

任何想法为什么?

2 个答案:

答案 0 :(得分:7)

它完全相反的顺序实际上只是一个巧合。使用不同的python版本/实现运行代码,您可能会得到不同的顺序。这是因为在python词典中没有排序,所以函数输出的顺序没有明确定义。 (将字符放入字典的顺序不是迭代字典时产生的顺序)。

如果您需要特定订单,可以使用内置parames.items()功能对sorted进行排序(可选择使用key关键字告诉sorted 如何对项目进行排序)。另一种选择是使用python2.7中出现的collections模块中的OrderedDict(如sr2222所指出的那样)。

答案 1 :(得分:3)

因为您正在打印字典,所以字典是无序的。迭代字典的顺序取决于许多因素,包括解释器类型,解释器版本和OS。如果您希望它与您输入的顺序相同,则必须使用collections.OrderedDict。或者,正如mgilson在他的回答中所说,你可以在打印之前对字典内容进行排序,但鉴于你想要的顺序不是按字母顺序排列的,它可能比它的价值更麻烦。