python中的關鍵字---7(re/序列化/Counter模組)
阿新 • • 發佈:2018-11-24
import re 正則
正則表示式
# 元字元
# \w 數字字母下劃線
# \W 非數字字母下劃線
# \d 數字
# \D 非數字
# \s 空白符(空格\製表符\換行符)
# \S 非空白符
# \t 製表符
# \n 換行符
# \b 單詞的邊界
# . 除了換行符以外的所有
# ^ 開始
# $ 結尾
# [..] 字元組
# [^..] 非字元組
# | 或(包含關係中,長的在前面)
# () 分組(在或的兩端,在新增量詞的時候,findall的時候優先要顯示的)
# (123\d)?
# 量詞
# {n}
# {n,}
# {n,m}
# ? 0,1
# + 1,~
# * 0,~
# 元字元 --> 一個字元匹配
# 元字元量詞 --> 預設貪婪匹配
# 元字元量詞? --> 惰性匹配/非貪婪模式
# 轉義符 \ : r'正則'
import re re模組
# re.findall('正則表示式','帶匹配的字元')
# ret = re.match('\d+','正則表示式','帶匹配的字元')
# ret = re.search('^\d+','正則表示式','帶匹配的字元')
# print(ret)
# print(ret.group())
# 引數 返回值
# findall 正則 待匹配字串 列表,所有符合的項
# search 正則 待匹配字串 變數,.group取結果,只有一項結果
# match 正則 待匹配字串 變數,.group取結果,預設在正則之前加上^
import json / pickle 序列化模組
import json
# 把其他的資料型別 -序列化(dumps)-> 字串
# 字串 -反序列化(loads)-> 把其他的資料型別
# ret = json.dumps(menu) # 把其他的資料型別 -序列化(dumps)-> 字串
# # print(ret) # json格式的字串
# # print(menu) # dict
# with open('file','w',encoding='utf-8') as f:
# f.write(ret)
# with open('file','r',encoding='utf-8') as f:
# dic = f.read()
# print(dic)
# diccc = json.loads(dic) # 字串 -反序列化(loads)-> 把其他的資料型別
# print(diccc['k'])
# 資料型別 <-轉換-> 字串
# 1.儲存在硬碟上 寫的每一個字元必須是字串/bytes資料型別
# 2.網路傳輸的時候 必須傳遞bytes/字串資料型別
# menu = {'key':"value","k":['v']}
# ret = json.dumps(menu)
# dic = json.loads(ret)
# 優缺點:
# 優: 所有的語言都通用
# 缺: 能支援的資料型別少 :dict list str 數字
import pickle
# json dumps/loads
# 字串的json資料 = json.dumps(其他資料型別)
# 其他資料型別= json.loads(字串的json資料)
# pickle dumps/loads dump/load
# bytes的pickle資料 = pickle.dumps(其他資料型別)
# 其他資料型別= pickle.loads(bytes的pickle資料)
# pickle.dump(資料型別,檔案控制代碼) # 這個資料型別被寫到檔案裡了
# pickle.load(檔案控制代碼) # 這個檔案裡的資料型別
import pickle
menu = {'key':"value","k":{'v',1,2}}
# ret = pickle.dumps(menu)
# print(type(ret),ret)
# dic = pickle.loads(ret)
# print(dic)
menu = {'key':"value","k":(1,2,3)}
# ret = pickle.dumps(menu)
# print(type(ret),ret)
# dic = pickle.loads(ret)
# print(dic)
menu = {'key':"value",1:'vvv'}
# ret = pickle.dumps(menu)
# print(type(ret),ret)
# dic = pickle.loads(ret)
# print(dic)
# 序列化模組總結 :
# 將基礎資料型別存到檔案中再讀出來
# 將基礎資料型別通過網路傳給其他程式,再由其他程式讀取並使用
# json
# 優點 : 所有語言通用
# 缺點 : 支援的資料型別少
# 方法和用法:
# dump
# dump(dict/list,檔案控制代碼) # 檔案控制代碼一定是以寫的形式開啟的
# load
# dict/list = load(檔案控制代碼) # 檔案控制代碼一定是以讀的形式開啟的
# dumps
# str = dumps(基礎資料型別)
# loads
# 基礎資料型別 = loads(str)
# pickle
# 優點 : 支援python中幾乎所有資料型別
# load檔案的時候,可以load多條資料,也可以dump多條資料
# 缺點 : 只支援在python程式之間交換資料
# dump(任意一個需要寫到檔案中的變數,檔案控制代碼) # 檔案控制代碼,wb/ab形式開啟
# load(檔案控制代碼) # 檔案控制代碼是以rb形式開啟
# pickle 的dump可以dump多次,load可以load多次
# dumps
# bytes = dumps(基礎資料型別)
# loads
# 基礎資料型別 = loads(bytes)
collections模組—— Counter
Counter目的是用來跟蹤值出現的次數。它是一個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。
計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似。
下面的程式碼說明了Counter類建立的四種方法:
Counter類的建立
>>> c = Counter() # 建立一個空的Counter類
>>> c = Counter('gallahad') # 從一個可iterable物件(list、tuple、dict、字串等)建立
>>> c = Counter({'a': 4, 'b': 2}) # 從一個字典物件建立
>>> c = Counter(a=4, b=2) # 從一組鍵值對建立
計數值的訪問與缺失的鍵
當所訪問的鍵不存在時,返回0,而不是KeyError;否則返回它的計數。
計數值的訪問>>> c = Counter("abcdefgab")
>>> c["a"]
2
>>> c["c"]
1
>>> c["h"]
0
計數器的更新(update和subtract)
可以使用一個iterable物件或者另一個Counter物件來更新鍵值。
計數器的更新包括增加和減少兩種。其中,增加使用update()方法:
計數器的更新(update)>>> c = Counter('which')
>>> c.update('witch') # 使用另一個iterable物件更新
>>> c['h']
3
>>> d = Counter('watch')
>>> c.update(d) # 使用另一個Counter物件更新
>>> c['h']
4
減少則使用subtract()方法:
計數器的更新(subtract)>>> c = Counter('which') >>> c.subtract('witch') # 使用另一個iterable物件更新 >>> c['h'] 1 >>> d = Counter('watch') >>> c.subtract(d) # 使用另一個Counter物件更新 >>> c['a'] -1
鍵的修改和刪除
當計數值為0時,並不意味著元素被刪除,刪除元素應當使用del
。
>>> c = Counter("abcdcba") >>> c Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1}) >>> c["b"] = 0 >>> c Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0}) >>> del c["a"] >>> c Counter({'c': 2, 'b': 2, 'd': 1})
其他常用操作
下面是一些Counter類的常用操作,來源於Python官方文件
Counter類常用操作sum(c.values()) # 所有計數的總數
c.clear() # 重置Counter物件,注意不是刪除
list(c) # 將c中的鍵轉為列表
set(c) # 將c中的鍵轉為set
dict(c) # 將c中的鍵值對轉為字典
c.items() # 轉為(elem, cnt)格式的列表
Counter(dict(list_of_pairs)) # 從(elem, cnt)格式的列表轉換為Counter類物件
c.most_common()[:-n:-1] # 取出計數最少的n個元素
c += Counter() # 移除0和負值