【第六周】组合数据类型

6.1集合类型及操作

集合类型定义

集合是多个元素的无序组合

  • 集合类型与数学的集合概念一致
  • 集合元素之间无序,每个元素唯一,不存在相同元素
  • 集合元素不可更改,不能是可变数据类型
    在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}

集合间操作

四种基本操作

六个操作符:

操作符及应用 描述
SlT 并,返回一个新集合,包括在集合S和T中的所有元素
S-T 差,返回一个新集合,包括在集合S但不在T中的元素
S&T 交,返回一个新集合,包括同时在集合S和T中的元素
S^T 补,返回一个新集合,包括集合S和T中的非相同元素
S<=T或S<T 返回True/False,判断S和T的子集关系
S>=T或S>T 返回True/Fasle,判断S和T的包含关系

四个增强操作符:

操作符及应用 描述
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")
运算结果

集合处理方法

操作函数或方法 描述
S.add(x) 如果x不在集合S中,将x增加到S
S.discard(x) 移除S中元素x,如果x不在集合S中,不报错
S.remove(x) 移除S中元素x。如果x不在集合S中,产生KeyError异常
S.clear() 移除S中所有元素
S.pop() 随即返回S的一个元素,更新S,若S为空产生KeyError异常
S.copy() 返回集合S的一个副本
len(S) 返回集合S的元素个数
x in S 判断S中元素x,x在集合S中,返回True,否则返回False
x not in S 判断S中元素x,x不在集合S中,返回True,否则返回False
set(x) 将其他类型变量x转变为集合类型

举例:

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

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

集合类型应用场景

1.包含关系比较

>>>"p"in{"p","y",123}
True        #判断其它的元素是否在这个集合中
>>>{"p","y"}>={"p","y",123}
False      #判断数据之间的关系

**2.数据去重**
集合类型所有元素无重复
```python
>>>Is=["p","p","y","y",123]
>>>s=set(1s)       # 利用了集合无重复的特点
{'p','y',123}
>>>It=list(s)         # 还可以将集合转换为列表
['p','y',123]

6.2序列类型及操作

序列类型定义

序列是具有先后关系的一组元素

  • 序列是一维元素向量,元素类型可以不同
  • 类似数学元素序列:S0,S1,...,Sn-1
  • 元素间由序号引导,通过下标访问序列的特定元素
    序列是一个基类类型

序列处理函数及方法

6个操作符:

操作符及应用 描述
x in s 如果x是序列s的元素,返回True,否则返回False
x not in s 如果x是序列s的元素,返回False,否则返回True
s+t 连接两个序列s和t
sn或ns 将序列s复制n次
s[i] 索引,返回s中的第i个元素,i是序列的序号
s[i:j]或[i:j:k] 切片,返回序列s中的第i到j以k为步长的元素子序列

举例说明:

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

5个函数和方法

函数和方法 描述
len(s) 返回序列s的长度,即元素个数
min(s) 返回序列s的最小元素,s中元素需要可比较
max(s) 返回序列s的最大元素,s中元素需要可比较
s.index(x)或s.index(x,i,j) 返回序列s从i开始到j位置中第一次出现元素x的位置
s.count(x) 返回序列s中出现x的总次数
>>>Is=["python",123,".io"]
>>>len(Is)            # 获取长度
3
>>>s="python123.io"
>>>max(s)        #获得最大元素(字母序)
'y'

元组类型及操作

元组是序列类型的一种扩展

  • 元组是一种序列类型,一旦创建就不能被修改
  • 使用小括号()或tuple()创建,元素间用逗号分隔
  • 可以使用或不使用小括号
>>>creature="cat","dog","tiger","human"
>>>creature
('cat','dog','tiger','human')
>>>color=(0x001100,"blue",creature)
>>>color
(4352,'blue',('cat','dog','tiger','human'))

元组继承序列类型的全部通用操作

  • 元组继承了序列类型的全部通用操作
  • 元组因为创建后不能修改,因此没有特殊操作
  • 使用或不使用小括号
    使用方法:
>>>creature="cat","dog",tiger","human"
>>>creature[::-1]
('human','tiger','dog','cat')
>>>color=(0x001100,"blue",creature)
>>>color[-1][2]
'tigher'

列表类型及操作

列表是序列类型的一种扩展,十分常用

  • 列表是一种序列类型,创建后可以随意被修改
  • 使用方括号[]或list()创建,元素间用逗号分隔
  • 列表中而元素类型可以不同,无长度限制
    举例:
>>>Is=["cat","dog","tiger",1024]
>>>Is
['cat','dog',tigher',1024]
>>>It=Is
>>>It
['cat','dog','tiger',1024]
# 注意:方括号[]真正创建一个列表,赋值仅传递引用,Is和It仅为名称

归纳:在定义列表时如果我们使用了方括号[]或者使用了函数list,那么我们真正的创建了一个列表,如果没有使用[]或list,那么仅仅使用赋值,它只是将一段列表赋给了一个新的名字,相当于重名名。
列表类型操作函数和方法

函数或方法 描述
Is[i]=x 替换列表Is第i元素为x
Is[i:j:k]=It 用列表It替换Is切片后所对应元素子列表
del Is[i] 删除列表Is中第i元素
del Is[i:j:k] 删除列表Is中第i到第j以k为步长的元素
Is+=It 更新列表Is,将列表It元素增加到列表Is中
Is*=n 更新列表Is,其元素重复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']
函数或方法 描述
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中出现的第一个元素x删除
Is.reverse() 将列表Is中的元素反转
>>>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中是否包含数字0>>>0 in It
  • 向It新增数字0>>>It.append(0)
  • 返回数字0所在It中的索引>>>It.index(0)
  • It的长度>>>len(It)
  • It中最大元素>>>max(It)
  • 清空It>>>It.clear()

序列类型应用场景

数据表示:元组和列表

  • 元组用于元素不改变的应用场景,更多用于固定搭配场景
  • 列表更加灵活,它是最常用的序列类型
  • 最主要作用:表示一组有序数据,进而操作它们
    1.元素遍历:
for item in Is:
<语句块>        # 对于列表

for item in tp:
<语句块>         # 元组类型
  1. 数据保护
  • 如果不希望数据被程序所改变,转换成元组类型
>>>Is=["cat","dog","tiger",1024]
>>>It=tuple(Is)
>>>It
('cat','dog',tiger',1024)

6.3实例9:基本统计值计算

“基本统计值计算”问题分析

基本统计值

  • 总个数:len()
  • 求和:for...in
  • 平均值:求和/总个数
  • 反差:各数据与平均数差的平方的和的平均数
  • 中位数:排序,然后... 奇数找之间1个,偶数找中间2个取平均

实例讲解

获得用户不定长度的输入:

#CalStatisticsV1.py
def getNum():       #获取用户不定长度的输入
    nums = []
    iNumStr = input("请输入数字(回车退出): ")
    while iNumStr != "":
        nums.append(eval(iNumStr))
        iNumStr = input("请输入数字(回车退出): ")
    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):    #计算中位数
    sorted(numbers)         # sorted对列表进行排序
    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()
print("平均值":{},方差:{:.2},中位数:{}.".format(m,dev(n,m),median(n)))

6.4 字典类型及操作

字典类型定义

理解“映射”

  • 映射是一种键(索引)和值(数据)的对应
    字典类型是“映射”的体现
  • 键值对:键是数据索引的扩展
  • 字典是键值对的集合,键值对之间无序
  • 采用大括号{}和dict()创建,键值对用冒好:表示
    举例:


    字典类型定义和使用

    "{}"是默认来生成字典类型的

字典处理函数及方法

函数或方法 描述
del d[k] 删除字典d中键k对应的数据值
k in d 判断键k是否在字典d中,如果在返回True,否则False
d.keys() 返回字典d中所有的键信息
d.values() 返回字典d中所有的值信息
d.items() 返回字典d中所有的键值对信息
字典类型操作
函数或方法 描述
d.get(k,<default>) 键k存在,则返回相应值,不在则返回<default>值
d.pop(k,<default>) 键k存在,则取出相应值,不在则返回<default>值
d.popitem() 随机从字典d中取出一个键值对,以元组形式返回
d.clear() 删除所有的键值对
len(d) 返回字典d中元素的个数

字典功能默写:

  • 定义空字典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()

字典类型应用场景

映射的表达

  • 映射无处不在,键值对无处不在
  • 例如:统计数据出现的次数,数据是键,次数是值
  • 最主要作用:表达键值对数据,进而操作他们
    元素遍历:
    for k in d:
    <语句块>

6.5模块5:jieba库的使用

jieba是优秀的中文分词第三方库

  • 中文文本需要通过分词获得单个的词语
  • jieba是优秀的中文分词第三方库,需要额外安装
  • jieba库提供三种分词模式,最简单只需掌握一个函数

jieba分词依靠中文词库

  • 利用一个中文词库,确定中文字符之间的关联概率
  • 中文字符间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义的词组

jieba分词的三种模式:精确模式、全模式、搜索引擎模式

  • 精确模式:把文本精确的切分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
  • 搜索引擎模式:在精确模式基础上,对长词再划分
函数 描述
jieba.lcut(s) 精确模式,返回一个列表类型的分词结果
jieba.lcut(s,cut_all=True) 全模式,返回一个列表类型的分词结果,存在冗余
jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型的分词结果,存在冗余
jieba.add_word(w) 向分词词典增加新词w

6.6实例10:文本词频统计

英文文本:哈姆雷特(HAMLET)
中文文本:三国演义
Hamlet词频统计:

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

《三国演义》人物出场统计:

#CalThreeKingdomsV1.py
import jieba            # 调用jieba库
txt = open("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))   # 打印输出

问题分析:
问题

进一步处理(人物出场统计):
关联相同概念的词频

#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 == "关公" or word == "云长":
        rword = "关羽"
    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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336