2011-07-31 26 views
1

pprint dictsキーをアルファベット順にソートすると、printがデフォルトの順序でソートされます。なぜpprintモジュールはdictキーをprintと別にソートするのですか?

from pprint import pprint 
d = {'foo': 1, 'bar': 2, 'baz': 3} 

pprint(d) 
# {'bar': 2, 'baz': 3, 'foo': 1} 

print d 
# {'baz': 3, 'foo': 1, 'bar': 2} 

pprintの文書はこれを言及し、なぜ言うことはありません。なぜ矛盾?

+1

「printはデフォルト順序で並べ替えます」とは言いません。要点はprint *はそれらをソートしないのに対し、 'pprint'は明示的にそれらをソートするのに対し、 'print'は、dictの反復動作によってキーが返される順序を単に使用します。これは、定義されていない順序であり、実装やマシンによって異なる場合があります。 –

答えて

6

pprintは「かすかな印刷」の略で、「人間の目を楽しんで、人間が簡単に読む」という意味です。 dictキーをソートすることはその目的にちょうど従います。pprintは主に高速であるとは考えられません(キーをソートするとペナルティが追加されます)。 :)

print一方、「できるだけ早く」印刷します。実際には、ここでの相違はdict__str__pprintの特別に細工された文字列変換です。

+0

だから、「そうだから」 –

+2

いいえ、それはそのように書かれていたので、目的を念頭に置いています。 pprintは、デバッグに使用され、キーをソートすることで、探している情報をもっと簡単に見つけることができます。 – pyroscope

0

pprintは、かなりであることを告げていますと、おそらく普通のprintは異なる何かを実装する必要がありました。さて、出力はそれほどではありませんが、少なくともソートされています。

printを使用する印刷辞書は、おそらく内部実装(ツリー?ハッシュテーブル?)に接続されています。辞書は要素にハッシュ可能である必要があることに注意してください。ここで私はいくつかの注文ルールを探しています。私の場合、正の整数で辞書を設定すると、出力がソートされます(hash(int)==int)。規則がどんなものであれ、printの文は、最も便利で最も速い方法で辞書を移動するだけで、特定の順序は想定できません。

+0

いいえ、選択した特定の正の整数を辞書に入力すると、出力がソートされますが、異なる整数を選択した場合、ソートされていない可能性があります。 'dict.fromkeys([1,8])' - > '{8:None、1:None}'です。 dictの 'str'メソッドはキーをハッシュテーブルに格納された順序で出力します。' pprint'は 'str'を使わないので、キーをソートして適切な場所に改行を挿入することができます。 – Duncan

+0

@duncanもちろん、あなたは正しいです。私は数字のシーケンスを追加することでこの簡単なテストをしましたが、実際には何も言いません。興味深いのは、反復処理中に要素の順序を調べることで基本的な実装を明らかにする方法です(例ではハッシュテーブルは8つのバケットから始まるようです)。 – tomasz

関連する問題