0x00:創建一鍵多值字典
字典是Python中的一種可變容器,通常以這種形式出現:
d = {key1:value1, key2:value2, key3:value3}
Python沒有規定字典中值的類型,所以如果想讓字典中的一個鍵對應多個值,只要把這些值放到列表這樣的容器里就行了。
Python資源共享群:484031800
student = { 'a': [76, 54, 82], 'b': [92, 67, 88] }
為了方便創建這樣的字典,可以使用 collections 模塊中的 defaultdict 類。一般在訪問一個字典中不存在的key時會報錯,defaultdict類則會自動初始化一個默認值。使用defaultdict可以這樣創建一個值為列表的字典:
d = defaultdict(list) d['a'].Append(1) d['a'].append(2) d['a'].append(3)
0x01:有序字典
Python中字典的key是不記錄順序的,如果我們想在對字典進行迭代或者序列化操作時掌握元素的順序,可以使用 collections 模塊中的 OrderedDict 類。
>>> from collections import OrderedDict >>> d = OrderedDict() >>> d['a'] = 1 >>> d['b'] = 2 >>> d['c'] = 3 >>> for key in d: ... print(key, d[key]) ... a 1 b 2 c 3
OrderedDict內部維護了一個雙向鏈表,每當字典中創建新元素,就會被放到鏈表的末尾。對已存在的鍵重新賦值不會改變鍵的順序。由于OrderedDict創建了額外的鏈表,所以占用空間會比普通的字典要多。使用這個類要注意取舍。
0x02:對序列去重但保持順序不變
要想去除一個列表中的重復項,只需要使用 set() 就可以了,set創建一個無重復項的集合,可以對其求交集、并集等操作。但是,這種集合對象是無序的。
>>> a = [1, 4, 6, 1, 2, 1, 3, 6, 2] >>> b = set(a) >>> b {1, 2, 3, 4, 6}
如果你既想要去除重復項,又想保留順序,可以通過 set() 加生成器的方式解決:
def dedupe(items): seen = set() for item in items: if item in items: if item not in seen: yield item seen.add(item)
這只有當序列中的元素是不可變對象時起作用,例如整數、字符串、元組。如果要應用在列表這類可變容器上,要對代碼稍作修改:
def dedupe(items): seen = set() for item in items: val = item if key is None else key(item) if val not in seen: yield item seen.add(val)
這里使用key參數來指定一個函數將序列中元素轉變為不可變類型。
0x03:統計元素的數量
如何找出一本書中出現頻率最高的單詞呢?或者想知道一個列表中相同元素出現的次數應該怎么做?使用 collections 模塊中的 Counter 類可以輕松做到。
>>> from collections import Counter >>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple'] >>> count = Counter(words) >>> count Counter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})
還可以使用Counter類的 most_common 方法來求排名前幾的元素:
>>> top = count.most_common(3) >>> print(top) [('apple', 3), ('double', 2), ('magic', 2)] >>>
另外,Counter對象還可以做數學運算:
>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple'] >>> other = ['apple', 'cool', 'duck', 'cookie'] >>> a = Counter(words) >>> b = Counter(other) >>> a Counter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1}) >>> b Counter({'apple': 1, 'cool': 1, 'duck': 1, 'cookie': 1}) >>> a + b Counter({'apple': 4, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1, 'cool': 1, 'duck': 1, 'cookie': 1}) >>>
Counter 類能夠幫助我們很好地對數據做統計,當然,如果你是在做算法題,請不要使用它來取巧。
0x04:字典推導式
想要創建一個字典的子集,可以用字典推導式(dictionary comprehension)輕松搞定。沒錯,列表有列表生成式,字典也有字典推導式。
>>> students = {'a':98, 'b':45, 'c':73, 'd':59} >>> passed = {key:value for key, value in students.items() if value >= 60} >>> passed {'a': 98, 'c': 73} >>>
看,我們很輕松地通過記錄所有學生成績的字典獲得了及格學生的成績。