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 に登場したcollectionsモジュールの OrderedDict を使用することです (sr2222 で指摘されているように)。

于 2012-07-30T13:42:24.273 に答える
3

辞書を印刷しているため、辞書は順不同です。ディクショナリが繰り返される順序は、インタープリターの種類、インタープリターのバージョン、OS などのさまざまな要因に依存します。入れたのと同じ順序で出てきたい場合は、collections.OrderedDict代わりに使用する必要があります。または、mgilson が回答で述べたように、印刷する前に辞書の内容を並べ替えることができますが、必要な順序がアルファベット順ではないことを考えると、おそらく価値があるよりも面倒です。

于 2012-07-30T13:42:50.227 に答える