為mooc網(wǎng)站的北京理工大學(xué)的 嵩天 、黃天羽 铐拐、禮欣 三位老師的課程筆記耻姥。
6 組合數(shù)據(jù)類型
6.1 集合類型及操作
6.2 序列類型及操作(元組類型、列表類型)
6.3 實例9:基本統(tǒng)計值計算
6.4 字典類型及操作
6.5 模塊5:jieba庫的使用
6.6 實例10:文本詞頻統(tǒng)計
6.1 集合類型及操作
集合類型定義跨扮;
集合操作符;
集合處理方法验毡;
集合類型應(yīng)用場景衡创;
6.1.1 集合定義
集合是不可變數(shù)據(jù)類型,每個元素唯一米罚,不存在相同元素钧汹,元素之間無順序丈探,用大括號{}表示录择,元素間用逗號分隔,建立集合用{}或set()碗降,<mark>建立空集合時必須使用set()</mark>隘竭;
A = {"python", 123, ("python", 123)}
:{123,'python',('python',123)}; #使用{}建立集合
B = set("pypy123")
:{'1','p','2','3','y'}; #使用set()建立集合
6.1.2 集合操作符
并,差讼渊,交动看,補(bǔ)
操作符及應(yīng)用 | 描述 |
---|---|
S | T | 返回一個新集合,包括在集合S和T中的所有元素 |
S - T | 返回一個新集合爪幻,包括在集合S但不在T中的元素 |
S & T | 返回一個新集合菱皆,包括同時在集合S和T中的元素 |
S ^ T | 返回一個新集合须误,包括集合S和T中的非相同元素 |
S <= T 或 S < T | 返回True/False,判斷S和T的子集關(guān)系 |
S >= T 或 S > T | 返回True/False仇轻,判斷S和T的包含關(guān)系 |
4個增強(qiáng)操作符及應(yīng)用 | 描述 |
---|---|
S |= T | 更新集合S京痢,包括在集合S和T中的所有元素 |
S -= T | 更新集合S,包括在集合S但不在T中的元素 |
S &= T | 更新集合S篷店,包括同時在集合S和T中的元素 |
S ^= T | 更新集合S祭椰,包括集合S和T中的非相同元素 |
6.1.3 集合處理方法
操作函數(shù)或方法 | 描述 |
---|---|
S.add(x) | 如果x不在集合S中,將x增加到S |
S.discard(x) | 移除S中元素x疲陕,如果x不在集合S中方淤,不報錯 |
S.remove(x) | 移除S中元素x,如果x不在集合S中蹄殃,產(chǎn)生KeyError異常 |
S.clear() | 移除S中所有元素 |
S.pop() | 隨機(jī)返回S的一個元素携茂,更新S,若S為空產(chǎn)生KeyError異常 |
S.copy(x) | 返回集合S的一個副本 |
len(S) | 返回集合S的元素個數(shù) |
x in S | 判斷S中元素x诅岩,x在集合S中邑蒋,返回True,否則返回False |
x not in S | 判斷S中元素x按厘,x不在集合S中医吊,返回True,否則返回False |
set(x) | 將其他類型變量x轉(zhuǎn)變?yōu)榧项愋?/td> |
6.1.4 集合類型應(yīng)用場景
- 包含關(guān)系比較逮京;
- 數(shù)據(jù)去重:集合類型所有元素?zé)o重復(fù)卿堂;
ls = ["p", "p", "y", "y", 123] s = set(ls) #利用了集合無重復(fù)元素的特點 lt = list(s) #將集合轉(zhuǎn)換為列表
6.2 序列類型及操作
序列類型定義;序列類型處理函數(shù)及方法懒棉;元組類型及操作草描;列表類型及操作;序列類型應(yīng)用場景策严;
6.2.1 定義
- 序列是具有先后關(guān)系的一組元素:是一維元素向量穗慕,元素類型可不同;類似數(shù)學(xué)元素妻导;元素間由序號引導(dǎo)逛绵,通過小標(biāo)訪問序列的特定元素;
- 序列是一個基類類型:里面有字符串類型倔韭,元組類型术浪,列表類型;
- 反向遞減寿酌,正向遞增胰苏;
6.2.2 處理函數(shù)及方法
操作符及應(yīng)用 | 描述 |
---|---|
x in S | 如果x是序列S的元素,返回True醇疼,否則返回False |
x not in S | 如果x不是S中硕并,返回True法焰,否則返回False |
s + t | 連接兩個序列s和t |
sn 或 ns | 將序列s復(fù)制n次 |
s[i] | 索引,返回s中的第i個元素倔毙,i是序列的序號 |
s[i:j]或s[i:j:k] | 切片壶栋,返回序列s中第i到j(luò)以k為步長的元素子序列 |
5個函數(shù)和方法
函數(shù)和方法 | 描述 |
---|---|
len(s) | 返回序列s的長度 |
min(s) | 返回序列s的最小元素,s中元素需要可比較 |
max(s) | 返回序列s的最大元素普监,s中元素需要可比較 |
s.index(x)或s.index(x,i,j) | 返回序列s從i開始到j(luò)位置中第一次出現(xiàn)元素x的位置 |
6.2.3 元組類型及操作
- 元組是序列類型的一種擴(kuò)展:一旦創(chuàng)建就不能被修改贵试;使用小括號()或tuple()創(chuàng)建,元素間用逗號分隔凯正;可使用小括號或不使用小括號毙玻;
- 元組繼承序列類型的全部通用操作:沒有特殊操作;
6.2.4 列表類型及操作
- 列表是序列類型廊散,創(chuàng)建后可隨意修改桑滩;使用[]或list()創(chuàng)建,元素間用逗號分隔允睹;
操作函數(shù)和方法
函數(shù)或方法 | 描述 |
---|---|
ls[i] = x | 替換列表ls第i元素為x |
ls[i:j:k] = lt | 用列表lt替換ls切片后所對應(yīng)元素子列表 |
del ls[i] | 刪除列表ls中第i元素 |
del ls[i:j:k] | 刪除列表ls中第i到第j以k為步長的元素 |
ls += lt | 更新列表ls运准,將列表lt元素增加到列表ls中 |
ls *= n | 更新列表ls,其元素重復(fù)n次 |
---------------- | -------------------------------------------- |
ls.append(x) | 在列表ls最后增加一個元素x |
ls.clear() | 刪除列表ls中所有元素 |
ls.copy() | 生成一個新列表缭受,賦值ls中所有元素 |
ls.insert(i,x) | 在列表ls的第i位置增加元素x |
ls.pop(i) | 將列表ls中第i位置元素取出并刪除該元素 |
ls.remove(x) | 將列表ls中出現(xiàn)的第一個元素刪除 |
ls.reverse() | 將列表ls中的元素反轉(zhuǎn) |
6.2.5 應(yīng)用場景
- 數(shù)據(jù)表示:元組用于元素不改變的應(yīng)用場景胁澳,更多用于固定搭配場景;列表更加靈活米者,最常用的序列類型韭畸;表示一組有序數(shù)據(jù);
- 元素遍歷:
for item in ls:
;for item in tp:
; - 數(shù)據(jù)保護(hù):不希望數(shù)據(jù)被程序所改變蔓搞,轉(zhuǎn)換成元組類型(tuple())胰丁;
# 6.1.3.py
A = {"python", 123, ("python", 123)}
try:
while True:
print(A.pop(),end="")
except:
pass
123python('python', 123)
6.3 基本數(shù)據(jù)統(tǒng)計值計算
需求:給出一組數(shù),對它們有個概要理解喂分;
- 總個數(shù):
len()
- 求和:
for ... in
- 平均值:求和/總個數(shù)
- 方差:各數(shù)據(jù)與平均數(shù)差的平方的和的平均數(shù)
- 中位數(shù):排序锦庸,求中間值
# 6.3CalStatisticsV1.py
def getNum(): #獲取用戶輸入
nums = []
iNumStr = input("請輸入數(shù)字(回車退出):")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("請輸入數(shù)字(回車退出):")
return nums
def mean(numbers): #計算平均值
s = 0.0
for num in numbers:
s = s + num
return s/len(numbers)
def dev(numbers, mean): #計算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return pow(sdev / (len(numbers)-1),0.5)
def median(numbers): #計算中位數(shù)
sorted(numbers) #排序
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum()
m = mean(n)
print("平均值:{},方差:{:.2},中位數(shù):{}".format(m,dev(n,m),median(n)))
請輸入數(shù)字(回車退出):1
請輸入數(shù)字(回車退出):2
請輸入數(shù)字(回車退出):3
請輸入數(shù)字(回車退出):4
請輸入數(shù)字(回車退出):5
請輸入數(shù)字(回車退出):
平均值:3.0,方差:1.6,中位數(shù):3
6.4 字典類型及操作
字典類型定義,字典處理函數(shù)及方法蒲祈,字典類型應(yīng)用場景
6.4.1 定義
- 字典類型是“映射”的體現(xiàn):鍵值對甘萧,鍵是數(shù)據(jù)索引的擴(kuò)展;字典是鍵值對的集合讳嘱,鍵值對之間無序幔嗦;采用大括號
{}
和dict()
創(chuàng)建,鍵值對用冒號:
表示沥潭;type(x)
:返回變量x的類型;
6.4.2 處理函數(shù)及方法
函數(shù)或方法 | 描述 |
---|---|
del d[k] | 刪除字典d中鍵k對應(yīng)的數(shù)據(jù)值 |
k in d | 判斷鍵k是否在字典d中嬉挡,如果在返回True钝鸽,否則False |
d.keys() | 返回字典d中所有的鍵信息 |
d.values() | 返回字典d中所有的值信息 |
d.get(k,<default>) | 鍵k存在汇恤,則返回相應(yīng)值,不在則返回<default>值 |
d.pop(k,<default>) | 鍵k存在拔恰,則取出相應(yīng)值因谎,不在則返回<default>值 |
d.popitem() | 隨機(jī)從字典d中取出一個鍵值對,以元組形式返回 |
d.clear() | 刪除所有的鍵值對 |
len(d) | 返回字典d中元素的個數(shù) |
6.4.3 應(yīng)用場景
映射的表達(dá)颜懊;表達(dá)鍵值對數(shù)據(jù)财岔,進(jìn)而操作它們;
6.5 jieba庫介紹
6.5.1 概述
中文分詞第三方庫河爹;
6.5.2 jieba分詞的三種模式
- 精確模式:把文本精確的切分開匠璧,不存在冗余單詞;全模式:把文本中所有可能的詞語都掃描出來咸这,有冗余夷恍;搜索引擎模式:在精確模式基礎(chǔ)上,對長詞再次切分媳维;
- 常用函數(shù)
函數(shù) | 描述 | 舉例 |
---|---|---|
jieba.lcut(s) | 精確模式酿雪,返回一個列表類型的分詞結(jié)果 | jieba.lcut("中國是一個偉大的國家"):['中國','是','一個','偉大','的','國家'] |
jieba.lcut(s,cut_all=True) | 全模式,返回一個列表類型的分詞結(jié)果侄刽,存在冗余 | jieba.lcut("中國是一個偉大的國家",cut_all=True):['中國','國是','一個','偉大','的','國家'] |
jieba.lcut_for_search(s) | 搜索引擎模式指黎,返回一個列表類型的分詞結(jié)果,存在冗余 | jieba.lcut_for_search("中華人民共和國是偉大的"):['中華','華人','人民','共和','共和國','中華人民共和國','是','偉大','的'] |
jieba.add_word(w) | 向分詞詞典增加新詞w | jieba.add_word("蟒蛇語言") |
6.6 實例10:文本詞頻統(tǒng)計
6.6.1 問題分析
在英文中文中州丹,出現(xiàn)哪些詞袋励,出現(xiàn)多少次?
6.6.2 hamlet英文詞頻統(tǒng)計
- CalHamletV1.py
6.6.3 三國演義人物出場統(tǒng)計
- CalThreeKingdomsV1.py
- CalThreeKingdomsV2.py
# CalHamletV1.py
def getText(): #獲取文本当叭,歸一化處理文本
txt = open("E:\python\learn\hamlet.txt","r").read() #打開文件
txt = txt.lower() #將所有大寫字母變成小寫
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~"': #將文本中特殊符號替換為空格
txt = txt.replace(ch," ")
return txt
hamletTxt = getText()
words = hamletTxt.split() #采用空格將字符串中的信息進(jìn)行分隔茬故,以列表形式返回給變量
counts = {}
for word in words:
counts[word] = counts.get(word,0) + 1 #統(tǒng)計字?jǐn)?shù)
items = list(counts.items()) #將字典類型轉(zhuǎn)換成列表類型
items.sort(key=lambda x:x[1], reverse=True) #對一個列表按照鍵值對的2個元素的第2個元素進(jìn)行排序,排序方式為由大到小的倒排
for i in range(10): #將前10位字?jǐn)?shù)打印輸出
word, count = items[i]
print("{0:<10}{1:>5}".format(word,count))
the 137
to 99
he 71
and 65
hamlet 57
of 52
his 52
was 49
that 36
king 31
#CalThreeKingdomsV1.py 三國演義人物出場文本統(tǒng)計
import jieba
txt = open("E:/python/learn/threekingdoms.txt","r",encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
曹操 934
孔明 831
將軍 761
卻說 647
玄德 569
關(guān)公 509
丞相 488
二人 465
不可 435
荊州 420
孔明曰 385
玄德曰 383
不能 383
如此 376
張飛 348
#CalThreeKingdomsV2.py 三國演義人物出場文本統(tǒng)計
import jieba
txt = open("E:/python/learn/threekingdoms.txt","r",encoding="utf-8").read()
excludes = {"將軍","卻說","荊州","二人","不可","不能","如此"} #構(gòu)建排除集合
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1:
continue
elif word =="諸葛亮" or word =="孔明曰":
rword = "孔明"
elif word =="關(guān)公" or word =="云長":
rword = "關(guān)羽"
elif word =="玄德" or word =="玄德曰":
rword = "劉備"
elif word =="孟德" or word =="丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,0) + 1
for word in excludes:
del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
曹操 1429
孔明 1373
劉備 1223
關(guān)羽 779
張飛 348
商議 344
如何 336
主公 327
軍士 310
呂布 300
左右 291
軍馬 288
次日 270
引兵 269
大喜 265
點贊蚁鳖,關(guān)注磺芭,收藏??,?醉箕,??點贊钾腺,關(guān)注,收藏??讥裤,?放棒,??點贊,關(guān)注己英,收藏??间螟,?,??
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????