1.7 å—典排åº�¶
问题¶
ä½ æƒ³åˆ›å»ºä¸€ä¸ªå—典,并且在è¿ä»£æˆ–åº�列化这个å—å…¸çš„æ—¶å€™èƒ½å¤ŸæŽ§åˆ¶å…ƒç´ çš„é¡ºåº�。
解决方案¶
为了能控制一个å—å…¸ä¸å…ƒç´ 的顺åº�ï¼Œä½ å�¯ä»¥ä½¿ç”¨ collections 模å�—ä¸çš„ OrderedDict 类。
在è¿ä»£æ“�作的时候它会ä¿�æŒ�å…ƒç´ è¢«æ�’入时的顺åº�,示例如下:
from collections import OrderedDict
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
print(key, d[key])
å½“ä½ æƒ³è¦�构建一个将æ�¥éœ€è¦�åº�列化或编ç �æˆ�å…¶ä»–æ ¼å¼�çš„æ˜ å°„çš„æ—¶å€™ï¼Œ OrderedDict 是é�žå¸¸æœ‰ç”¨çš„。
æ¯”å¦‚ï¼Œä½ æƒ³ç²¾ç¡®æŽ§åˆ¶ä»¥ JSON ç¼–ç �å�Žå—段的顺åº�ï¼Œä½ å�¯ä»¥å…ˆä½¿ç”¨ OrderedDict æ�¥æž„å»ºè¿™æ ·çš„æ•°æ�®ï¼š
>>> import json
>>> json.dumps(d)
'{"foo": 1, "bar": 2, "spam": 3, "grok": 4}'
>>>
讨论¶
OrderedDict 内部维护ç�€ä¸€ä¸ªæ ¹æ�®é”®æ�’入顺åº�排åº�çš„å�Œå�‘链表。æ¯�æ¬¡å½“ä¸€ä¸ªæ–°çš„å…ƒç´ æ�’入进æ�¥çš„æ—¶å€™ï¼Œ
它会被放到链表的尾部。对于一个已ç»�å˜åœ¨çš„键的é‡�å¤�赋值ä¸�会改å�˜é”®çš„顺åº�。
需è¦�注æ„�的是,一个 OrderedDict 的大å°�是一个普通å—典的两å€�ï¼Œå› ä¸ºå®ƒå†…éƒ¨ç»´æŠ¤ç�€å�¦å¤–一个链表。
æ‰€ä»¥å¦‚æžœä½ è¦�构建一个需è¦�大é‡� OrderedDict 实例的数æ�®ç»“构的时候(比如读å�– 100,000 行 CSV æ•°æ�®åˆ°ä¸€ä¸ª OrderedDict 列表ä¸åŽ»ï¼‰ï¼Œ
é‚£ä¹ˆä½ å°±å¾—ä»”ç»†æ�ƒè¡¡ä¸€ä¸‹æ˜¯å�¦ä½¿ç”¨ OrderedDict 带æ�¥çš„好处è¦�大过é¢�å¤–å†…å˜æ¶ˆè€—的影å“�。