【第六周】組合數(shù)據(jù)類型

6.1集合類型及操作

集合類型定義

集合是多個元素的無序組合

  • 集合類型與數(shù)學(xué)的集合概念一致
  • 集合元素之間無序,每個元素唯一,不存在相同元素
  • 集合元素不可更改,不能是可變數(shù)據(jù)類型
    在python里面:
  • 集合用大括號{}表示,元素間用逗號分隔
  • 建立集合類型用{}或set()
  • 建立空集合類型,必須使用set()
    舉個例子:
>>> A = {"python",123,("python,123")}    # 使用{}建立集合
{123,'python',('python',123)}
>>> B = set("pypy123")        # 使用set()建立集合
{'1','p','2','3','y'}
>>> C = {"python",123,"python",123}
{'python',123}

集合間操作

四種基本操作

六個操作符:

操作符及應(yīng)用 描述
SlT 并,返回一個新集合,包括在集合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/Fasle,判斷S和T的包含關(guān)系

四個增強操作符:

操作符及應(yīng)用 描述
Sl=T 并,更新集合S,包括在集合S和T中的所有元素
S-=T 差,更新集合S,包括在集合S但不在T中的元素
S&=T 交,更新集合S,包括同時在集合S和T中的元素
S^=T 補,更新集合S,包括在集合S和T中的非相同元素

舉例說明:

>>>A={"p","y",123}
>>>B=set("pypy123")
運算結(jié)果

集合處理方法

操作函數(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() 隨即返回S的一個元素,更新S,若S為空產(chǎn)生KeyError異常
S.copy() 返回集合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>

舉例:

>>>A={"p","y",123}
>>>for item in A:
            print(item,end="")
輸出:{'p',123,'y'}

>>>try:
    while True:
        print(A.pop(),end=""))
    except:
        pass
輸出:空集合

集合類型應(yīng)用場景

1.包含關(guān)系比較

>>>"p"in{"p","y",123}
True        #判斷其它的元素是否在這個集合中
>>>{"p","y"}>={"p","y",123}
False      #判斷數(shù)據(jù)之間的關(guān)系

**2.數(shù)據(jù)去重**
集合類型所有元素?zé)o重復(fù)
```python
>>>Is=["p","p","y","y",123]
>>>s=set(1s)       # 利用了集合無重復(fù)的特點
{'p','y',123}
>>>It=list(s)         # 還可以將集合轉(zhuǎn)換為列表
['p','y',123]

6.2序列類型及操作

序列類型定義

序列是具有先后關(guān)系的一組元素

  • 序列是一維元素向量,元素類型可以不同
  • 類似數(shù)學(xué)元素序列:S0,S1,...,Sn-1
  • 元素間由序號引導(dǎo),通過下標(biāo)訪問序列的特定元素
    序列是一個基類類型

序列處理函數(shù)及方法

6個操作符:

操作符及應(yīng)用 描述
x in s 如果x是序列s的元素,返回True,否則返回False
x not in s 如果x是序列s的元素,返回False,否則返回True
s+t 連接兩個序列s和t
sn或ns 將序列s復(fù)制n次
s[i] 索引,返回s中的第i個元素,i是序列的序號
s[i:j]或[i:j:k] 切片,返回序列s中的第i到j(luò)以k為步長的元素子序列

舉例說明:

>>>Is=["python",123,".io"]
>>>Is[::-1]                # 切片操作,返回列表中所有元素,從元素最后向最前提取的一個子序列。將列表元素取反
['.io',123,'python']
>>>s="python123.io"
>>>s[::-1]                #對字符串取反
'oi.321nohtyp'

5個函數(shù)和方法

函數(shù)和方法 描述
len(s) 返回序列s的長度,即元素個數(shù)
min(s) 返回序列s的最小元素,s中元素需要可比較
max(s) 返回序列s的最大元素,s中元素需要可比較
s.index(x)或s.index(x,i,j) 返回序列s從i開始到j(luò)位置中第一次出現(xiàn)元素x的位置
s.count(x) 返回序列s中出現(xiàn)x的總次數(shù)
>>>Is=["python",123,".io"]
>>>len(Is)            # 獲取長度
3
>>>s="python123.io"
>>>max(s)        #獲得最大元素(字母序)
'y'

元組類型及操作

元組是序列類型的一種擴展

  • 元組是一種序列類型,一旦創(chuàng)建就不能被修改
  • 使用小括號()或tuple()創(chuàng)建,元素間用逗號分隔
  • 可以使用或不使用小括號
>>>creature="cat","dog","tiger","human"
>>>creature
('cat','dog','tiger','human')
>>>color=(0x001100,"blue",creature)
>>>color
(4352,'blue',('cat','dog','tiger','human'))

元組繼承序列類型的全部通用操作

  • 元組繼承了序列類型的全部通用操作
  • 元組因為創(chuàng)建后不能修改,因此沒有特殊操作
  • 使用或不使用小括號
    使用方法:
>>>creature="cat","dog",tiger","human"
>>>creature[::-1]
('human','tiger','dog','cat')
>>>color=(0x001100,"blue",creature)
>>>color[-1][2]
'tigher'

列表類型及操作

列表是序列類型的一種擴展,十分常用

  • 列表是一種序列類型,創(chuàng)建后可以隨意被修改
  • 使用方括號[]或list()創(chuàng)建,元素間用逗號分隔
  • 列表中而元素類型可以不同,無長度限制
    舉例:
>>>Is=["cat","dog","tiger",1024]
>>>Is
['cat','dog',tigher',1024]
>>>It=Is
>>>It
['cat','dog','tiger',1024]
# 注意:方括號[]真正創(chuàng)建一個列表,賦值僅傳遞引用,Is和It僅為名稱

歸納:在定義列表時如果我們使用了方括號[]或者使用了函數(shù)list,那么我們真正的創(chuàng)建了一個列表,如果沒有使用[]或list,那么僅僅使用賦值,它只是將一段列表賦給了一個新的名字,相當(dāng)于重名名。
列表類型操作函數(shù)和方法

函數(shù)或方法 描述
Is[i]=x 替換列表Is第i元素為x
Is[i:j:k]=It 用列表It替換Is切片后所對應(yīng)元素子列表
del Is[i] 刪除列表Is中第i元素
del Is[i:j:k] 刪除列表Is中第i到第j以k為步長的元素
Is+=It 更新列表Is,將列表It元素增加到列表Is中
Is*=n 更新列表Is,其元素重復(fù)n次

舉例子:

>>>Is=["cat","dog","tiger",1024]
>>>Is[1:2]=[1,2,3,4]
['cat',12,3,4,'tiger',1024]
>>>del Is[::3]
[1,2,4,'tiger']
>>>Is*2
[1,2,4,'tiger',1,2,4,'tiger']
函數(shù)或方法 描述
Is.append(x) 在列表Is最后增加一個元素
Is.clear() 刪除列表Is中所有元素
Is.copy() 生成一個新列表,賦值Is中所有元素
Is.insert(i,x) 在列表Is的第i位置增加元素x
Is.pop(i) 將列表Is中的第i位置元素取出并刪除該元素
Is.remove(x) 將列表Is中出現(xiàn)的第一個元素x刪除
Is.reverse() 將列表Is中的元素反轉(zhuǎn)
>>>Is=["cat","dog","tiger",1024]
>>>Is.append(1234)
['cat','dog','tiger',1024,1234]
>>>Is.insert(3,"human")
['cat',dog','tigher','human','dog','cat']

默寫:

  • 定義空列表It >>>It=[]
  • 向It新增5個元素 >>>It+=[1,2,3,4,5]
  • 修改It中的第2個元素 >>>It[2]=6
  • 向It中第2個位置增加一個元素 >>>It.insert(2,7)
  • 從It中第1個位置刪除第一個元素 >>>del It[1]
  • 刪除It中第1-3位置元素 >>>del It[1:4]
  • 判斷It中是否包含數(shù)字0>>>0 in It
  • 向It新增數(shù)字0>>>It.append(0)
  • 返回數(shù)字0所在It中的索引>>>It.index(0)
  • It的長度>>>len(It)
  • It中最大元素>>>max(It)
  • 清空It>>>It.clear()

序列類型應(yīng)用場景

數(shù)據(jù)表示:元組和列表

  • 元組用于元素不改變的應(yīng)用場景,更多用于固定搭配場景
  • 列表更加靈活,它是最常用的序列類型
  • 最主要作用:表示一組有序數(shù)據(jù),進(jìn)而操作它們
    1.元素遍歷:
for item in Is:
<語句塊>        # 對于列表

for item in tp:
<語句塊>         # 元組類型
  1. 數(shù)據(jù)保護(hù)
  • 如果不希望數(shù)據(jù)被程序所改變,轉(zhuǎn)換成元組類型
>>>Is=["cat","dog","tiger",1024]
>>>It=tuple(Is)
>>>It
('cat','dog',tiger',1024)

6.3實例9:基本統(tǒng)計值計算

“基本統(tǒng)計值計算”問題分析

基本統(tǒng)計值

  • 總個數(shù):len()
  • 求和:for...in
  • 平均值:求和/總個數(shù)
  • 反差:各數(shù)據(jù)與平均數(shù)差的平方的和的平均數(shù)
  • 中位數(shù):排序,然后... 奇數(shù)找之間1個,偶數(shù)找中間2個取平均

實例講解

獲得用戶不定長度的輸入:

#CalStatisticsV1.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)

計算中位數(shù):

def median(numbers):    #計算中位數(shù)
    sorted(numbers)         # sorted對列表進(jìn)行排序
    size = len(numbers)
    if size % 2 == 0:
        med = (numbers[size//2-1] + numbers[size//2])/2
    else:
        med = numbers[size//2]
    return med

進(jìn)行函數(shù)調(diào)用:

n=getNum()
m=mean()
print("平均值":{},方差:{:.2},中位數(shù):{}.".format(m,dev(n,m),median(n)))

6.4 字典類型及操作

字典類型定義

理解“映射”

  • 映射是一種鍵(索引)和值(數(shù)據(jù))的對應(yīng)
    字典類型是“映射”的體現(xiàn)
  • 鍵值對:鍵是數(shù)據(jù)索引的擴展
  • 字典是鍵值對的集合,鍵值對之間無序
  • 采用大括號{}和dict()創(chuàng)建,鍵值對用冒好:表示
    舉例:


    字典類型定義和使用

    "{}"是默認(rèn)來生成字典類型的

字典處理函數(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.items() 返回字典d中所有的鍵值對信息
字典類型操作
函數(shù)或方法 描述
d.get(k,<default>) 鍵k存在,則返回相應(yīng)值,不在則返回<default>值
d.pop(k,<default>) 鍵k存在,則取出相應(yīng)值,不在則返回<default>值
d.popitem() 隨機從字典d中取出一個鍵值對,以元組形式返回
d.clear() 刪除所有的鍵值對
len(d) 返回字典d中元素的個數(shù)

字典功能默寫:

  • 定義空字典d>>>d={}
  • 向d新增2個鍵值對元素>>>d["a"]=1;d["b"]=2
  • 修改第2個元素>>>d["b"]=3
  • 判斷字符“c”是否是d的鍵>>>"c" in d
  • 計算d的長度>>>len(d)
  • 清空d>>>d.clear()

字典類型應(yīng)用場景

映射的表達(dá)

  • 映射無處不在,鍵值對無處不在
  • 例如:統(tǒng)計數(shù)據(jù)出現(xiàn)的次數(shù),數(shù)據(jù)是鍵,次數(shù)是值
  • 最主要作用:表達(dá)鍵值對數(shù)據(jù),進(jìn)而操作他們
    元素遍歷:
    for k in d:
    <語句塊>

6.5模塊5:jieba庫的使用

jieba是優(yōu)秀的中文分詞第三方庫

  • 中文文本需要通過分詞獲得單個的詞語
  • jieba是優(yōu)秀的中文分詞第三方庫,需要額外安裝
  • jieba庫提供三種分詞模式,最簡單只需掌握一個函數(shù)

jieba分詞依靠中文詞庫

  • 利用一個中文詞庫,確定中文字符之間的關(guān)聯(lián)概率
  • 中文字符間概率大的組成詞組,形成分詞結(jié)果
  • 除了分詞,用戶還可以添加自定義的詞組

jieba分詞的三種模式:精確模式、全模式、搜索引擎模式

  • 精確模式:把文本精確的切分開,不存在冗余單詞
  • 全模式:把文本中所有可能的詞語都掃描出來,有冗余
  • 搜索引擎模式:在精確模式基礎(chǔ)上,對長詞再劃分
函數(shù) 描述
jieba.lcut(s) 精確模式,返回一個列表類型的分詞結(jié)果
jieba.lcut(s,cut_all=True) 全模式,返回一個列表類型的分詞結(jié)果,存在冗余
jieba.lcut_for_search(s) 搜索引擎模式,返回一個列表類型的分詞結(jié)果,存在冗余
jieba.add_word(w) 向分詞詞典增加新詞w

6.6實例10:文本詞頻統(tǒng)計

英文文本:哈姆雷特(HAMLET)
中文文本:三國演義
Hamlet詞頻統(tǒng)計:

#CalHamletV1.py
def getText():
    txt = open("hamlet.txt", "r").read()
    txt = txt.lower()
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch, " ")   #將文本中特殊字符替換為空格
    return txt
 
hamletTxt = getText()
words  = hamletTxt.split()
counts = {}
for word in words:           
    counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True) 
for i in range(10):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

《三國演義》人物出場統(tǒng)計:

#CalThreeKingdomsV1.py
import jieba            # 調(diào)用jieba庫
txt = open("threekingdoms.txt", "r", encoding='utf-8').read()      # 打開文件
words  = jieba.lcut(txt)
counts = {}           # 構(gòu)造字典
for word in words:       # 逐一遍歷
    if len(word) == 1:
        continue
    else:
        counts[word] = counts.get(word,0) + 1   # 計數(shù)
items = list(counts.items())             # 轉(zhuǎn)換為列表類型
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))   # 打印輸出

問題分析:
問題

進(jìn)一步處理(人物出場統(tǒng)計):
關(guān)聯(lián)相同概念的詞頻

#CalThreeKingdomsV2.py
import jieba
excludes = {"將軍","卻說","荊州","二人","不可","不能","如此"}      # 排除冗余
txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
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(10):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容