字典是一種關聯容器,每個鍵都映射到一個單獨的值上,如果想讓鍵映射到多個值,需要將這多個值保存到另一個容器如列表或集合中
如果希望保留元素插入的順序,就用列表;如果希望消除重復元素且不在意他們的順序,就用集合
1.collections模塊中的defaultdict類
1) defaultdict類的一個特點是它會自動初始化第一個值,這樣只需要關注添加元素即可
d = defaultdict(set)
d['a'].add(1)
或
d = defaultdict(list)
d['a'].append(1)
2) defaultdict會自動創建字典表項以待稍后的訪問(即使這些表項在字典中還沒有找到,若不想使用此功能,可以在普通的字典上調用setdefault()方法來取代
如d = {}# a regular dictionary
d.setdefault('a',[]).append()
2. collections中的OrderedDict類
3) 讓字典保持有序,對字典做迭代時,會按照元素初始添加的順序進行
當想構建一個映射結構一遍稍后進行序列化或轉換為另一種格式時,OrderedDict類非常有用,如進行JSON編碼時希望精確控制各字段的順序,那么首先在OrderedDict中構建數據即可
2) OrderedDict內部維護了一個雙向鏈表,會根據元素加入的順序來排列鍵的位置,新加入的元素被放在鏈表末尾,對已存在的鍵重新賦值不會改變鍵的順序
OrderedDict的內存開支是普通字典的兩倍多,是由於額外創建的鏈表所致,構建一個涉及大量OrderedDict實例的數據結構,需要權衡使用OrderedDict的好處能否超過內存開銷帶來的缺點