Python Collections里一些常用字典類的用法


  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;否則,將 kdefault 以鍵值對的形式添加到 dict 里面,並返回 default。是不是有點類似 JavaHashMap  的 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})

 

轉載請注明出處~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM