2011-07-31 25 views
1

pprint按字母順序排序鍵排序,print按默認順序排序。爲什麼pprint模塊對打印的字母鍵進行排序?

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 *不會*排序它們,而'pprint'明確地排序它們。 'print'僅使用dict的迭代器行爲返回鍵的順序,這是一個未定義的順序,可能因實現和機器而異。 –

回答

6

pprint代表「漂亮印花」,也意味着「悅目人眼,易於人類閱讀」。對dict鍵進行排序的目的是,pprint不應該主要是快速的(排序鍵會增加罰款),但是,errr,漂亮。 :)

print另一方面「只是打印」,儘可能快。實際上,這裏的差異在dict__str__pprint的特製字符串轉換之間。

+0

那麼,「僅僅因爲它的方式」,那麼呢? –

+2

不,因爲它是按照這種方式編寫的,其目的在於記住。印刷是例如用於調試和對鍵進行排序,使您可以更輕鬆地找到所需的信息。 – 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

相關問題