Python 里面的 Collections 模塊幫我們實現了很多常用的集合類,特別是一些字典累的子類,使用起來操作簡單但卻有着極強的作用,不像 Java 啥東西都要造輪子。之前遇到過一些字典類的靈活方法,打算根據Python官方文檔,為 Counter, defaultdict, OrderedDict 三個常用的字典類進行一個總結。
defaultdict
defaultdict 可以指定字典的鍵所對應的值的類型,輕易地將鍵值對、字符串轉換為字典、計數字典
1 指定值(字典的值的類型) 為列表
當鍵第一次出現的時候,字典對象 d 利用 default_factory 方法創建了一個空列表,然后 list.append 方法將其對應的值添加到空列表中;當鍵再次出現的時候,list.append() 方法再次將新的值添加進該鍵對應的列表。這個技術比用 dict.setdefault() 更方便和快捷。
1 s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 2 3 d = defaultdict(list) 4 for k, v in s: 5 d[k].append(v) 6 print(d) 7 # {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}
用 setdefault 其實可以得到同樣的效果,但是速度沒有 defauldict 速度快,dict.setdefault(k, default) 作用是如果 k 在 dict 里面,則返回其 key;否則,將 k 與default 以鍵值對的形式添加到 dict 里面,並返回 default。是不是有點類似 Java 里 HashMap 的 getOrDefault(key, defaultValue) 方法,只不過這個方法是這樣的:如果當前 map 存在 key,則返回 key 對應的 value,否則,返回默認值 defaultValue。
1 d = {} 2 for k, v in s: 3 d.setdefault(k, []).append(v) 4 d.items() 5 print(d) 6 # {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}
2 指定值為集合
1 s2 = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)] 2 d2 = defaultdict(set) 3 for k, v in s2: 4 d2[k].add(v) 5 print(d2) 6 # defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
3 指定值為整形,用於計數
1 s3 = 'mississippi' 2 d3 = defaultdict(int) 3 for k in s3: 4 d3[k] += 1 5 print(d3) 6 # defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})
1 # dict.get(key, default = None) 2 # 參數: key,需要在字典中查找的值,若查找成功,則返回該鍵對應的值。 default: 如果查找不到該key則返回這個特定值 3 print(d3.get('dqwhui', None))
OrderedDict
是字典的一個子類(增: dic[key] = value; 刪:dic.pop(key))
可以對鍵值對添加進字典的順序進行記錄: popitem(last = True) :LIFO模式, 刪除最后進來的鍵值對; last = False : FIFO,刪除最開始進來的鍵值對。
對已存在的健的位置進行操作: move_to_end(key, last = True),將已存在的健的位置移動到最右端,或者最左端(last = False)。
而且使用 OrderDict 可以很方便地實現LRU機制。
1 dic = OrderedDict() 2 dic['a'] = 1 3 dic['b'] = 2 4 dic['c'] = 3 5 6 for k,v in dic.items(): 7 print(k,v) 8 # a 1 9 # b 2 10 # c 3 11 12 dic.popitem(last = False) 13 for k,v in dic.items(): 14 print(k,v) 15 # b 2 16 # c 3 17 18 dic.move_to_end('b', last = True) 19 for k,v in dic.items(): 20 print(k,v) 21 # c 3 22 # b 2
Counter
Counter 是 dict 的一個子類,用於對哈希對象進行計數。他是一個以元素值作為鍵、元素出現的次數作為值的一個無序 collection。
1 對可迭代對象或者其他映射進行計數
1 # 1、1 2 s = 'sqwjodiqdjpneqonfpi23jpjp32pej3p' 3 dict1 = Counter(s) 4 print(dict1) 5 # Counter({'p': 6, 'j': 5, 'q': 3, '3': 3, 'o': 2, 'd': 2, 'i': 2, 'n': 2, 'e': 2, '2': 2, 's': 1, 'w': 1, 'f': 1}) 6 7 c = Counter(cats=4, dogs=8) 8 print(c) 9 # Counter({'dogs': 8, 'cats': 4}) 10 11 # 1、2 12 d = Counter(['eggs', 'ham']) 13 print(d, d['bacon']) 14 # Counter({'eggs': 1, 'ham': 1}) 0 15 16 d['eggs'] = 0 # counter entry with a zero count並不會將這個鍵值對消除 17 print(d) 18 # Counter({'ham': 1, 'eggs': 0}) 19 20 del d['eggs'] # 這樣才會將鍵值對消除 21 print(d) 22 # Counter({'ham': 1})
2 新增的一些方法
1 # 2、1 elements() 2 c = Counter(a=4, b=2, c=0, d=-2) 3 print(list(c.elements())) 4 # ['a', 'a', 'a', 'a', 'b', 'b'] 5 6 # 2、2 most_common([n]) 返回一個列表,出現次數最多的前n個元素及其對應的次數,以元組形式 7 e = Counter('abracadabra').most_common(3) 8 print(e) 9 # [('a', 5), ('b', 2), ('r', 2)] 10 11 # 2、3 subtract([iterable-or-mapping]) 相當於做減法 12 c = Counter(a=4, b=2, c=0, d=-2) 13 d = Counter(a=1, b=2, c=3, d=-4, g = 8) 14 c.subtract(d) 15 print(c) 16 # Counter({'a': 3, 'd': 2, 'b': 0, 'c': -3, 'g': -8})
3 Counter 對象的常用形式
1 sum(c.values()) # total of all counts 2 c.clear() # reset all counts 3 list(c) # list unique elements 4 set(c) # convert to a set 5 dict(c) # convert to a regular dictionary 6 c.items() # convert to a list of (elem, cnt) pairs 7 Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs 8 c.most_common()[:-n-1:-1] # n least common elements 9 c += Counter() # remove zero and negative counts
1 d += Counter() 2 print(d) 3 # Counter({'g': 8, 'c': 3, 'b': 2, 'a': 1})
轉載請注明出處~