0

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

任何想法为什么?

4

2 回答 2

7

事实上,它的顺序完全相反,这实际上只是一个巧合。使用不同版本/实现的 python 运行代码,您可能会得到不同的排序。这样做的原因是因为在 python 字典中没有排序,所以你的函数的输出顺序没有很好地定义。(你把东西放入字典的顺序不是你遍历字典时产生它们的顺序)。

如果你想要一个特定的顺序,你可以parames.items()使用内置sorted函数进行排序(可选地使用key关键字来告诉sorted 如何对项目进行排序)。另一种选择是使用出现在 python2.7 中的集合模块中的 OrderedDict(如 sr2222 所指出的那样)。

于 2012-07-30T13:42:24.273 回答
3

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

于 2012-07-30T13:42:50.227 回答