1. 程式人生 > >python中的關鍵字---7(re/序列化/Counter模組)

python中的關鍵字---7(re/序列化/Counter模組)

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和負值