【6】Python組合數(shù)據(jù)類型

集合類型及操作

集合類型定義

多個(gè)元素的無序組合

  • 與數(shù)學(xué)中的集合概念一致
  • 集合元素之間無序,每個(gè)元素唯一,不存在相同元素
  • 集合元素不可更改,不可變數(shù)據(jù)類型

集合是多個(gè)元素的無序組合

  • {}表示,元素間用逗號(hào)分隔
  • 建立集合類型用{}set()
  • 建立空集合類型,必須使用set()

集合操作符

符號(hào) 描述
S │ T 并運(yùn)算
S - T 差運(yùn)算
S & T 交運(yùn)算
S ^ T 補(bǔ)運(yùn)算
S <= TS < T 返回True/False,判斷S和T的子集關(guān)系
S >= TS > T 返回True/False,判斷S和T的包含關(guān)系

四個(gè)增強(qiáng)操作符

符號(hào) 描述
S │= T 更新集合S,包括在集合S和T中的所有元素
S - = T 更新集合S,包括在集合S但不在T中的所有元素
S &= T 更新集合S,包括同時(shí)在集合S和T中的所有元素
S ^= T 更新集合S,包括在集合S和T中的非相同元素

集合處理方法

操作函數(shù)或方法 描述
S.add(x) 如果x不在集合S中,將x添加到S
S.discard(x) 移除S中的x。若x不在集合S中,不報(bào)錯(cuò)
S.remove(x) 移除S中的x。若x不在集合S中,產(chǎn)生KeyError異常
S.clear() 移除S中所有元素
S.pop() 隨機(jī)返回S中的一個(gè)元素,更新S,若S為空產(chǎn)生KeyError異常
S.copy() 返回集合S的一個(gè)副本
len(S) 返回S的元素個(gè)數(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)換為集合類型

從A中不斷取出元素進(jìn)行打印

for item in A:
    print(item, end='')
try:
    while True:
        print(A.pop(), end='')
except:
    pass

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

包含關(guān)系的比較

使用保留字in,>=,>,<=,<

數(shù)據(jù)去重

>>> ls = ['p', 'p', 'y', 'y', 123]
>>> s = set(ls)
{'p', 'y', 123}
>>> lt = list(s)
['p', 'y', 123]

序列類型及操作

序列類型定義

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

  • 一維元素向量,元素類型可以不同
  • 類似數(shù)學(xué)元素序列
  • 元素間由序號(hào)引導(dǎo),通過下標(biāo)訪問序列的特定元素

序列是一個(gè)基類類型,可衍生為字符串、元祖和列表類型
序號(hào):正向遞增,反向遞減

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

6個(gè)操作符

操作符及使用 描述
x in s 判斷s中元素x,x在序列s中返回True,否則返回False
x not in s 判斷s中元素x,x在序列s中返回False,否則返回True
s + t 連接兩個(gè)序列s和t
s * nn * s 將序列s復(fù)制n次
s[i] 索引,返回s中的第i個(gè)元素,i是序列的序號(hào)
s[i:j]s[i:j:k] 切片,返回序列s中第i到第j以k為步長的元素子序列

5個(gè)函數(shù)及方法

函數(shù)及方法 描述
len(s) 返回序列s的長度
min(s) 返回序列s中的最小元素
max(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ù)

元組類型及操作

元組是序列類型的一種擴(kuò)展

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

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

  • 元組繼承了序列類型的全部通用操作
  • 創(chuàng)建后不可修改,因此沒有特殊操作
  • 使用或不使用小括號(hào)

列表類型及操作

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

  • 列表是一種序列類型,創(chuàng)建后可以隨意被修改
  • 使用方括號(hào)[]list()創(chuàng)建,元素間用逗號(hào),分隔
  • 列表中各元素類型可以不同,無長度限制
ls = ['cat', 'dog', 'tiger', 1024]
>>> ls
['cat', 'dog', 'tiger', 1024]
>>> lt = ls   #方括號(hào)[]真正創(chuàng)建一個(gè)列表,賦值僅傳遞引用,并沒有再生成一個(gè)列表
>>> lt
['cat', 'dog', 'tiger', 1024]

列表類型操作函數(shù)和方法

函數(shù)或方法 描述
ls[i] = x 替換列表ls第i元素為x
ls[i:j:k] = lt 用列表lt替換ls切片后所對(duì)應(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最后增加一個(gè)元素x
ls.clear() 刪除列表ls中所有元素
ls.copy() 生成一個(gè)新列表,賦值ls中所有元素
ls.insert(i,x) 在列表ls的第i位置增加元素x
ls.pop(i) 在列表ls中第i位置元素取出并刪除該元素
ls.remove(x) 將列表ls中出現(xiàn)的第一個(gè)元素x刪除

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

  • 元組用于元素不改變的應(yīng)用場景,更多用于固定搭配場景
  • 列表更加靈活,最常用的序列類型
  • 最主要作用:表示一組有序數(shù)據(jù),進(jìn)而操作它們

元素遍歷

for item in ls:
    <語句塊>

數(shù)據(jù)保護(hù)

  • 如果不希望數(shù)據(jù)被程序所改變,轉(zhuǎn)換成元組類型
>>> ls = ['cat', 'dog', 'tiger', 1024]
>>> lt = tuple(ls)
>>> lt
('cat', 'dog', 'tiger', 1024)

實(shí)例9:基本統(tǒng)計(jì)值計(jì)算

基本統(tǒng)計(jì)值

  • 需求:給出一組數(shù),對(duì)它們有個(gè)該要理解
    總數(shù)、求和、平均值、方差、中位數(shù)...
  • 總個(gè)數(shù):len()
  • 求和:for ... in
  • 平均值:求和/總個(gè)數(shù)
  • 方差:各數(shù)據(jù)與平均數(shù)差的平方和的平均數(shù)
  • 中位數(shù)

實(shí)例講解

#CalStatisticsV1.py
def getNum():    #獲取用戶不定長度的輸入
    nums = []
    iNumStr = input('請(qǐng)輸入數(shù)字(回車退出):')
    while iNumStr != '':
        nums.append(eval(iNumStr))
        iNumStr = input('請(qǐng)輸入數(shù)字(回車退出):')
    return nums
def mean(numbers):    #計(jì)算平均值
    s = 0.0
    for num in numbers:
        s = s + num
    return s / len(numbers)
def dev(numbers, mean):    #計(jì)算方差
    sdev = 0.0
    for num in numbers:
        sdev = sdev + (num - mean)**2
    return pow(sdev / (len(numbers)-1), 0.5)
def median(numbers):    #計(jì)算中位數(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('平均值:{},方差:{},中位數(shù):{}.'.format(m, dev(n,m), median(n)))

舉一反三

技術(shù)能力擴(kuò)展

  • 獲取多個(gè)數(shù)據(jù):從控制臺(tái)獲取多個(gè)不確定數(shù)據(jù)的方法
  • 分隔多個(gè)函數(shù):模塊化設(shè)計(jì)方法
  • 充分利用函數(shù):充分利用Python提供的內(nèi)容函數(shù)

字典類型及操作

字典類型定義

理解“映射”

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

字典類型的用法

在字典變量中,通過鍵獲得值
<字典變量>={<鍵1>:<值1>, <鍵2>:<值2>, ..., <鍵n>:<值n>}
<值>=<字典變量>[<鍵>]
<字典變量>[<鍵>]=<值>
[]用來向字典變量中索引或增加元素

字典處理函數(shù)及方法

函數(shù)或方法 描述
del d[k] 刪除字典d中對(duì)應(yīng)的數(shù)據(jù)值
k in d 判斷鍵k是否在字典d中,如果在返回True,否則False
d.keys() 返回字典d中所有的鍵信息
d.values() 返回字典d中所有的值信息
d.iems() 返回字典d中所有的鍵值對(duì)信息
d.get(k,<default>) 鍵k存在,返回相應(yīng)值,不存在則返回<default>值
d.pop(k,<default>) 鍵k存在,取出相應(yīng)值,不存在則返回<default>值
d.popitem() 隨機(jī)從字典d中取出一個(gè)鍵值對(duì),以元組形式返回
d.clear() 刪除所有的鍵值對(duì)
len(d) 返回字典d中元素的個(gè)數(shù)

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

映射的表達(dá)

  • 映射無處不在,鍵值對(duì)無處不在
    例如:統(tǒng)計(jì)數(shù)據(jù)出現(xiàn)的次數(shù),數(shù)據(jù)是鍵,次數(shù)是值
  • 最主要作用:表達(dá)鍵值對(duì)數(shù)據(jù),進(jìn)而操作它們

元素遍歷

for k in d:
    <語句塊>

模塊5:jieba庫的使用

jieba庫基本介紹

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

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

jieba庫的安裝

cmd命令行:

pip install jieba

jieba分詞的原理

jieba分詞依靠中文詞庫

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

jieba庫使用說明

三個(gè)模式

  • 精確模式:把文本精確的切分開,不存在冗余單詞
  • 全模式:把文本中所有可能的詞語都掃描出來,有冗余
  • 搜索引擎模式:在精確模式基礎(chǔ)上,對(duì)長詞再次切分
函數(shù) 描述
jieba.lcut(s) 精確模式,返回一個(gè)列表類型的分詞結(jié)果
jieba.lcut(s, cut_all=True) 全模式,返回一個(gè)列表類型的分詞結(jié)果,存在冗余
jieba.lcut_for_search(s) 搜索引擎模式,返回一個(gè)列表類型的分詞結(jié)果,存在冗余
jieba.add_word(w) 向分詞詞典增加新詞w
>>> jieba.lcut('中國是一個(gè)偉大的國家')
['中國', '是', '一個(gè)', '偉大', '的', '國家']
>>> jieba.lcut('中國是一個(gè)偉大的國家', cut_all=True)
['中國', '國是', '一個(gè)', '偉大', '的', '國家']
>>> jieba.lcut_for_search('中華人民共和國是偉大的')
['中華', '華人', '人民', '共和', '共和國', '中華人民共和國', '是', '偉大', '的']

實(shí)例10:文本詞頻統(tǒng)計(jì)

  • 需求:一篇文章,出現(xiàn)了哪些單詞?出現(xiàn)的次數(shù)?
    英文文本?中文文本?

英文文本:Hamlet分析詞頻
中文文本:《三國演義》分析人物

“Hamlet英文詞頻統(tǒng)計(jì)”實(shí)例講解

#CalHamletV1.py
def getText():
    txt = open('hamlet.txt', 'r').read()
    txt = txt.lower()    #都轉(zhuǎn)化為小寫
    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    #返回鍵word對(duì)應(yīng)的值
item = list(counts.item())
items.sort(key = lambda x:x[1], reverse = True)    #對(duì)列表按照鍵值對(duì)的值進(jìn)行排序,由大到小
for i in range(10):
    word, count = items[i]
    print('{0:<10}{1:>5}'.format(word, count))

輸出結(jié)果

the        1138
and         965
to          754
of          669
you         550
i           542
a           542
my          514
hamlet      462
in          436

《三國演義》人物出廠統(tǒng)計(jì)

#CalThreeKingdomsV1.py
import jieba
txt = open('threekingkoms.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))

輸出結(jié)果

曹操          953
孔明          836
將軍          772
卻說          656
玄德          585
關(guān)公          510
丞相          491
二人          469
不可          440
荊州          425
玄德曰         390
孔明曰         390
不能          384
如此          378
張飛          358

將詞頻與人物相關(guān)聯(lián),面向問題
詞頻統(tǒng)計(jì)→人物統(tǒng)計(jì)
給出排除詞庫

#CalThreeKingdomsV1.py
import jieba
txt = open('threekingkoms.txt', 'r', encoding='utf-8').read()
excludes = {'將軍', '卻說', '荊州', '二人', '不可', '不能', '如此'}
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.get(word,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))

輸出結(jié)果里可能還含有其他詞語,加入excludes里不斷優(yōu)化

舉一反三

應(yīng)用問題的擴(kuò)展

  • 《紅樓夢(mèng)》、《西游記》、《水滸站》...
  • 政府工作報(bào)告、科研論文、新聞報(bào)道...
  • 進(jìn)一步,詞云
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • A、組合數(shù)據(jù)類型概述 計(jì)算機(jī)不僅對(duì)單個(gè)變量表示的數(shù)據(jù)進(jìn)行處理,更多情況,計(jì)算機(jī)需要對(duì)一組數(shù)據(jù)進(jìn)行批量處理。例: 給...
    井上皓閱讀 5,390評(píng)論 0 3
  • 基于《Python語言程序設(shè)計(jì)基礎(chǔ)(第2版)》 第一部分 初識(shí)Python語言 第1章 程序設(shè)計(jì)基本方法 1.1 ...
    柄志閱讀 27,802評(píng)論 4 44
  • 集合類型 集合是多個(gè)元素的無序組合集合類型與數(shù)學(xué)中的集合概念一致集合元素之間無序,每個(gè)元素唯一,不存在相同元素 集...
    丿小七閱讀 596評(píng)論 0 0
  • 最近幾年看了很多與《紅樓夢(mèng)》相關(guān)的文章,也一遍遍的閱讀過原著,回想第一次閱讀時(shí)自己還不足10歲,對(duì)于書中那些晦澀難...
    lu青l(xiāng)u閱讀 325評(píng)論 5 3
  • 犯錯(cuò)不可怕,可怕的是不告訴承擔(dān)犯錯(cuò)后該承擔(dān)的責(zé)任,人要不但的去探索,敢于犯錯(cuò)敢于承擔(dān)。領(lǐng)導(dǎo)者最重要的品質(zhì)就...
    孫倩閱讀 248評(píng)論 0 0

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