自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入Python中的 Collections 模塊

開發(fā) 后端
collections模塊是一個不用不知道,一用就上癮的模塊。這里主要介紹OrderedDict類、defaultdict類、Counter類、namedtuple類和deque類。

[[351552]]

collections模塊是一個不用不知道,一用就上癮的模塊。這里主要介紹OrderedDict類、defaultdict類、Counter類、namedtuple類和deque類。

collections

collections的常用類型有:

  • 計數(shù)器(Counter)
  • 雙向隊列(deque)
  • 默認字典(defaultdict)
  • 有序字典(OrderedDict)
  • 可命名元組(namedtuple)

Counter

計數(shù)器(counter)以字典的形式返回序列中各個字符出現(xiàn)的次數(shù),值為key,次數(shù)為value

Counter是對字典類型的補充,用于追蹤值得出現(xiàn)次數(shù) 。

  1. import collections 
  2.  
  3. counter = collections.Counter("My name is Runsen"
  4. print(counter) 

輸出如下

  1. Counter({' ': 3, 'n': 3, 'e': 2, 's': 2, 'M': 1, 'y': 1, 'a': 1, 'm': 1, 'i': 1, 'R': 1, 'u': 1}) 

取得元素重復次數(shù)的值

  1. print(counter[' ']) 

elements()取得計數(shù)器中的所有元素。

注:此處非所有元素集合,而是包含所有元素集合的迭代器.

  1. counter = collections.Counter('abcabcabcdabcdef')  
  2. print(counter) 
  3. # 輸出如下 
  4. Counter({'a': 4, 'b': 4, 'c': 4, 'd': 2, 'e': 1, 'f': 1}) 
  5.  
  6. print(counter.elements()) 
  7. # 輸出如下 
  8. <itertools.chain object at 0x0000025B1477BF98> 
  9.  
  10. print(list(counter.elements())) 
  11. # 輸出如下 
  12. ['a''a''a''a''b''b''b''b''c''c''c''c''d''d''e''f'

將Counter按照value從大到小排列,獲取前N個元素,需要使用函數(shù)most_common

  1. # most_common(N)數(shù)量從大到小排列,獲取前N個元素  
  2. print(counter.most_common(3)) 
  3. # 輸出如下 
  4. [('a', 4), ('b', 4), ('c', 4)] 

sorted將Counter中的key進行排序,返回的是所有key的列表

  1. # sorted()列出所有不同的元素并排序  
  2. print(sorted(counter)) 
  3.  
  4. # 輸出如下 
  5. ['a''b''c''d''e''f'

將Counter轉換成字符串,字符串的join方法可以解決。注意不是原來的模樣。

  1. # 轉換成字符串  
  2. print(''.join(counter.elements())) 
  3. # aaaabbbbccccddef 
  4. print(''.join(list(counter.elements()))) 

update()更新計數(shù)器,其實在原本的counter更新計數(shù)器,如果原來沒有,則新建key,如果有value則加一

  1. update()更新計數(shù)器, 
  2. d = collections.Counter('a')  
  3. counter.update(d)  
  4. print(counter)  
  5. # 輸出如下 
  6. Counter({'a': 5, 'b': 4, 'c': 4, 'd': 2, 'e': 1, 'f': 1}) 

update()更新計數(shù)器,那么subtract()相減計數(shù)器的values,即原來的計數(shù)器中的每一個元素的數(shù)量減去后添加的元素的數(shù)量

  1. counter.subtract('abdabcabcg')  
  2. print(counter) 
  3.  
  4. # 輸出如下 
  5. Counter({'a': 2, 'c': 2, 'b': 1, 'd': 1, 'e': 1, 'f': 1, 'g': -1}) 

deque

deque支持從任意一端增加和刪除元素。更為常用的兩種結構,就是棧和隊列。

deque的常見操作

  1. #定義一個空的雙向隊列 
  2. d = collections.deque() 
  3.  
  4. #從右端增加元素 
  5. d.extend("Runsen")  
  6. d.append("Maoli"
  7. d.append("Python"
  8. d.append("king"
  9.  
  10. #從左端增加元素 
  11. d.appendleft('left'
  12. print(d) 
  13. # 輸出如下 (注意:extend和append的區(qū)別) 
  14. deque(['left''R''u''n''s''e''n''Maoli''Python''king']) 
  15.  
  16. # reverse()反轉隊列  
  17. print(d.reverse()) 
  18. d.reverse() 
  19. print(d) 
  20. # 輸出如下 
  21. None 
  22. deque(['king''Python''Maoli''n''e''s''n''u''R''left']) 
  23.  
  24.  
  25. d.reverse() 
  26. d.extend(['qq','ww','ee'])  
  27. print(d)  
  28. # deque(['left''R''u''n''s''e''n''Maoli''Python''king''qq''ww''ee']) 
  29.  
  30.  
  31. count()計數(shù)  
  32. print(d.count('R')) 
  33. # 輸出如下 
  34.  
  35. # clear()清空隊列  
  36. d.clear()  
  37. print(d)  
  38. # 輸出如下 
  39. deque([]) 
  40.  
  41. index()取得元素下標  
  42. print(d.index('Maoli')) 
  43. # 輸出如下 
  44.  
  45. insert()指定位置插入元素  
  46. d.insert(1,'Runsen')  
  47. print(d)  
  48. # deque(['left''Runsen',R', 'u', 'n', 's', 'e', 'n', 'Maoli', 'Python', 'king', 'qq', 'ww', 'ee']) 

OrderedDict

使用dict時要保持Key的順序,可以用OrderedDict。

  1. from collections import OrderedDict  
  2. dic = OrderedDict()  
  3. dic['k1'] = 'v1'  
  4. dic['k2'] = 'v2'  
  5. dic['k3'] = 'v3'  
  6. print(dic)  
  7. # 輸出如下 
  8. OrderedDict([('k1''v1'), ('k2''v2'), ('k3''v3')]) 
  9.  
  10. # 字典所有的鍵  
  11. print(dic.keys()) 
  12. # 輸出如下 
  13.  
  14. odict_keys(['k1''k2''k3']) 
  15.      
  16. # 字典所有值  
  17. print(dic.values()) 
  18. # 輸出如下 
  19. odict_values(['v1''v2''v3']) 
  20.      
  21. # items() 方法以列表返回可遍歷的(鍵, 值) 元組數(shù)組  
  22. print(dic.items()) 
  23.  
  24. # 輸出如下 
  25. odict_items([('k1''v1'), ('k2''v2'), ('k3''v3')]) 
  26.      
  27.  
  28. #pop()方法,刪除指定的鍵值  
  29. dic.pop('k1')   
  30. print(dic)  
  31. # 輸出如下 
  32. OrderedDict([('k2''v2'), ('k3''v3')]) 
  33.  
  34.  
  35. #popitem()方法,默認刪除字典最后一個元素  
  36. dic.popitem()  
  37. print(dic)  
  38. # 輸出如下 
  39. OrderedDict([('k2''v2')]) 
  40.  
  41. update()更新字典  
  42. dic.update({'k1':'v1111','k10':'v10'})  
  43. print(dic)  
  44. # 輸出如下 
  45. OrderedDict([('k2''v2'), ('k1''v1111'), ('k10''v10')]) 

OrderedDict和字典操作完全相同,區(qū)別在于OrderedDict的Key會按照插入的順序排列,不是Key本身排序

  1. >>> from collections import OrderedDict 
  2. >>> d = dict([('a', 1), ('b', 2), ('c', 3)]) 
  3. >>> d # dict的Key是無序的 
  4. {'a': 1, 'c': 3, 'b': 2} 
  5. >>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 
  6. >>> od # OrderedDict的Key是有序的 
  7. OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 

defaultdict

在使用字典的時候, 如果在使用不存在的key的時候發(fā)生KeyError這樣的一個報錯, 這時候就該defaultdict登場了。

defaultdict接受一個工廠函數(shù)作為參數(shù)來構造:dict =defaultdict( factory_function)這個factory_function可以是list、set、str等等,作用是當key不存在時,返回的是工廠函數(shù)的默認值,比如list對應[ ],str對應的是空字符串,set對應set( ),int對應0,如下舉例:

  1. from collections import defaultdict 
  2.  
  3. dict1 = defaultdict(int
  4. dict2 = defaultdict(set
  5. dict3 = defaultdict(str) 
  6. dict4 = defaultdict(list) 
  7. dict1[2] ='two' 
  8.  
  9. print(dict1[1]) 
  10. print(dict2[1]) 
  11. print(dict3[1]) 
  12. print(dict4[1]) 
  13.  
  14. # 輸出如下 
  15. set() 
  16.  
  17. [] 

defaultdict類接受類型名稱作為初始化函數(shù)的參數(shù),這樣使得默認值的取值更加靈活。

  1. s = 'mynameisrunsen' 
  2. d = collections.defaultdict(int
  3. for k in s: 
  4.     d[k] += 1 
  5. print(d) 
  6.  
  7. # 輸出如下 
  8. defaultdict(<class 'int'>, {'m': 2, 'y': 1, 'n': 3, 'a': 1, 'e': 2, 'i': 1, 's': 2, 'r': 1, 'u': 1}) 

練習有如下值集合 [11,22,33,44,55,66,77,88,99,99]。

下面將所有大于 55的值保存至字典的第一個key中,將小于 55 的值保存至第二個key的值中。

下面通過defaultdict默認字典對列表進行劃分。

  1. all_list = [11,22,33,44,55,66,77,88,99] 
  2. dic = collections.defaultdict(list) 
  3. for i in all_list: 
  4.     if i > 55: 
  5.         dic['k1'].append(i) 
  6.     else
  7.         dic['k2'].append(i) 
  8. print(dic) 
  9. # 輸出如下 
  10. defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [66, 77, 88, 99]}) 

也可以使用字典,具體代碼如下。

  1. all_list = [11,22,33,44,55,66,77,88,99] 
  2. dic = {} 
  3. for i in all_list: 
  4.     if i > 55: 
  5.         if "k1" in dic.keys(): 
  6.             dic['k1'].append(i) 
  7.         else
  8.             dic['k1'] = [i,] 
  9.     else
  10.         if "k2" in dic.keys(): 
  11.             dic['k2'].append(i) 
  12.         else
  13.             dic['k2'] = [i,] 
  14. print(dic) 
  15. # 輸出如下 
  16. {'k2': [11, 22, 33, 44, 55], 'k1': [66, 77, 88, 99]} 

namedtuple

namedtuple是用來創(chuàng)建一個自定義的tuple對象,并且規(guī)定了tuple元素的個數(shù),并可以用屬性而不是索引來引用tuple的某個元素。

使用命名元組的步驟:

  1. # 將元組封裝為一個類,可以通過字段名(屬性名)來訪問元組中的值 
  2. # 支持元組的所有操作 
  3. from collections import namedtuple 
  4. # 1、定義一個類 
  5. Runsen = namedtuple('Runsen', ['name','sex','age']) 
  6. # 2、創(chuàng)建對象 
  7. runsen = Runsen("Runsen""帥男", 21) 
  8. # 3、獲取命名元組的值 
  9. print(runsen[1])    # 支持元組的索引取值   
  10. print(runsen[-2:])  # 支持切片 
  11. print(runsen.name)  # 支持通過字段名來取值  
  12. # _fields,獲取命名元組的所有屬性名 
  13. print(runsen._fields) 
  14. # _asdict方法,將元組轉化為字典 
  15. print(runsen._asdict()) 
  16.  
  17. # 輸出如下 
  18.  
  19. 帥男 
  20. ('帥男', 21) 
  21. Runsen 
  22. ('name''sex''age'
  23. OrderedDict([('name''Runsen'), ('sex''帥男'), ('age', 21)]) 

本文已收錄 GitHub,傳送門~[1] ,里面更有大廠面試完整考點,歡迎 Star。

Reference

[1]傳送門~:

https://github.com/MaoliRUNsen/runsenlearnpy100

 

責任編輯:姜華 來源: Python之王
相關推薦

2020-11-06 13:42:59

itertools

2023-11-27 15:08:52

Python編程語言

2022-03-22 06:33:49

Python內置模塊函數(shù)

2020-11-05 08:56:19

Python

2023-08-15 11:24:42

人工智能AI

2023-11-15 08:32:16

正則表達式Python

2009-05-08 09:46:37

微軟C#集合對象

2024-01-22 12:10:57

zoneinfo模塊解析

2020-11-12 08:52:16

Python

2010-02-03 10:12:53

Python模塊

2018-05-28 09:20:10

Python迭代for循環(huán)

2016-08-31 15:50:50

PythonThreadLocal變量

2021-08-12 15:45:23

Pythonimport模塊

2023-11-23 12:29:53

Python

2021-04-14 06:19:29

PythonPillow圖片處理模塊

2023-12-22 08:38:02

Pythondatetimetime

2010-04-12 16:28:41

無線通信模塊

2020-11-10 08:45:35

Python

2024-05-07 00:00:00

工具類開發(fā)者功能

2010-03-04 14:51:21

Python Conf
點贊
收藏

51CTO技術棧公眾號