================================ 1.7 å—å…¸æŽ’åº ================================ ---------- 问题 ---------- ä½ æƒ³åˆ›å»ºä¸€ä¸ªå—典,并且在è¿ä»£æˆ–åºåˆ—化这个å—å…¸çš„æ—¶å€™èƒ½å¤ŸæŽ§åˆ¶å…ƒç´ çš„é¡ºåºã€‚ ---------- 解决方案 ---------- 为了能控制一个å—å…¸ä¸å…ƒç´ 的顺åºï¼Œä½ å¯ä»¥ä½¿ç”¨ ``collections`` 模å—ä¸çš„ ``OrderedDict`` 类。 在è¿ä»£æ“作的时候它会ä¿æŒå…ƒç´ 被æ’入时的顺åºï¼Œç¤ºä¾‹å¦‚下: .. code-block:: python 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`` æ¥æž„å»ºè¿™æ ·çš„æ•°æ®ï¼š .. code-block:: python >>> import json >>> json.dumps(d) '{"foo": 1, "bar": 2, "spam": 3, "grok": 4}' >>> ---------- 讨论 ---------- ``OrderedDict`` 内部维护ç€ä¸€ä¸ªæ ¹æ®é”®æ’入顺åºæŽ’åºçš„åŒå‘链表。æ¯æ¬¡å½“ä¸€ä¸ªæ–°çš„å…ƒç´ æ’入进æ¥çš„时候, 它会被放到链表的尾部。对于一个已ç»å˜åœ¨çš„键的é‡å¤èµ‹å€¼ä¸ä¼šæ”¹å˜é”®çš„顺åºã€‚ 需è¦æ³¨æ„的是,一个 ``OrderedDict`` 的大å°æ˜¯ä¸€ä¸ªæ™®é€šå—典的两å€ï¼Œå› 为它内部维护ç€å¦å¤–一个链表。 æ‰€ä»¥å¦‚æžœä½ è¦æž„建一个需è¦å¤§é‡ ``OrderedDict`` 实例的数æ®ç»“æž„çš„æ—¶å€™ï¼ˆæ¯”å¦‚è¯»å– 100,000 è¡Œ CSV æ•°æ®åˆ°ä¸€ä¸ª ``OrderedDict`` 列表ä¸åŽ»ï¼‰ï¼Œ é‚£ä¹ˆä½ å°±å¾—ä»”ç»†æƒè¡¡ä¸€ä¸‹æ˜¯å¦ä½¿ç”¨ ``OrderedDict`` 带æ¥çš„好处è¦å¤§è¿‡é¢å¤–内å˜æ¶ˆè€—çš„å½±å“。