为mooc网站的北京理工大学的 嵩天 、黄天羽 、礼欣 三位老师的课程笔记。
6 组合数据类型
6.1 集合类型及操作
6.2 序列类型及操作(元组类型、列表类型)
6.3 实例9:基本统计值计算
6.4 字典类型及操作
6.5 模块5:jieba库的使用
6.6 实例10:文本词频统计
6.1 集合类型及操作
集合类型定义;
集合操作符;
集合处理方法;
集合类型应用场景;
6.1.1 集合定义
集合是不可变数据类型,每个元素唯一,不存在相同元素,元素之间无顺序,用大括号{}表示,元素间用逗号分隔,建立集合用{}或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 集合操作符
并,差,交,补
操作符及应用 | 描述 |
---|---|
S | T | 返回一个新集合,包括在集合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/False,判断S和T的包含关系 |
4个增强操作符及应用 | 描述 |
---|---|
S |= T | 更新集合S,包括在集合S和T中的所有元素 |
S -= T | 更新集合S,包括在集合S但不在T中的元素 |
S &= T | 更新集合S,包括同时在集合S和T中的元素 |
S ^= T | 更新集合S,包括集合S和T中的非相同元素 |
6.1.3 集合处理方法
操作函数或方法 | 描述 |
---|---|
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(x) | 返回集合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转变为集合类型 |
6.1.4 集合类型应用场景
- 包含关系比较;
- 数据去重:集合类型所有元素无重复;
ls = ["p", "p", "y", "y", 123] s = set(ls) #利用了集合无重复元素的特点 lt = list(s) #将集合转换为列表
6.2 序列类型及操作
序列类型定义;序列类型处理函数及方法;元组类型及操作;列表类型及操作;序列类型应用场景;
6.2.1 定义
- 序列是具有先后关系的一组元素:是一维元素向量,元素类型可不同;类似数学元素;元素间由序号引导,通过小标访问序列的特定元素;
- 序列是一个基类类型:里面有字符串类型,元组类型,列表类型;
- 反向递减,正向递增;
6.2.2 处理函数及方法
操作符及应用 | 描述 |
---|---|
x in S | 如果x是序列S的元素,返回True,否则返回False |
x not in S | 如果x不是S中,返回True,否则返回False |
s + t | 连接两个序列s和t |
sn 或 ns | 将序列s复制n次 |
s[i] | 索引,返回s中的第i个元素,i是序列的序号 |
s[i:j]或s[i:j:k] | 切片,返回序列s中第i到j以k为步长的元素子序列 |
5个函数和方法
函数和方法 | 描述 |
---|---|
len(s) | 返回序列s的长度 |
min(s) | 返回序列s的最小元素,s中元素需要可比较 |
max(s) | 返回序列s的最大元素,s中元素需要可比较 |
s.index(x)或s.index(x,i,j) | 返回序列s从i开始到j位置中第一次出现元素x的位置 |
6.2.3 元组类型及操作
- 元组是序列类型的一种扩展:一旦创建就不能被修改;使用小括号()或tuple()创建,元素间用逗号分隔;可使用小括号或不使用小括号;
- 元组继承序列类型的全部通用操作:没有特殊操作;
6.2.4 列表类型及操作
- 列表是序列类型,创建后可随意修改;使用[]或list()创建,元素间用逗号分隔;
操作函数和方法
函数或方法 | 描述 |
---|---|
ls[i] = x | 替换列表ls第i元素为x |
ls[i:j:k] = lt | 用列表lt替换ls切片后所对应元素子列表 |
del ls[i] | 删除列表ls中第i元素 |
del ls[i:j:k] | 删除列表ls中第i到第j以k为步长的元素 |
ls += lt | 更新列表ls,将列表lt元素增加到列表ls中 |
ls *= n | 更新列表ls,其元素重复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中出现的第一个元素删除 |
ls.reverse() | 将列表ls中的元素反转 |
6.2.5 应用场景
- 数据表示:元组用于元素不改变的应用场景,更多用于固定搭配场景;列表更加灵活,最常用的序列类型;表示一组有序数据;
- 元素遍历:
for item in ls:
;for item in tp:
; - 数据保护:不希望数据被程序所改变,转换成元组类型(tuple());
# 6.1.3.py
A = {"python", 123, ("python", 123)}
try:
while True:
print(A.pop(),end="")
except:
pass
123python('python', 123)
6.3 基本数据统计值计算
需求:给出一组数,对它们有个概要理解;
- 总个数:
len()
- 求和:
for ... in
- 平均值:求和/总个数
- 方差:各数据与平均数差的平方的和的平均数
- 中位数:排序,求中间值
# 6.3CalStatisticsV1.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) #排序
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},中位数:{}".format(m,dev(n,m),median(n)))
请输入数字(回车退出):1
请输入数字(回车退出):2
请输入数字(回车退出):3
请输入数字(回车退出):4
请输入数字(回车退出):5
请输入数字(回车退出):
平均值:3.0,方差:1.6,中位数:3
6.4 字典类型及操作
字典类型定义,字典处理函数及方法,字典类型应用场景
6.4.1 定义
- 字典类型是“映射”的体现:键值对,键是数据索引的扩展;字典是键值对的集合,键值对之间无序;采用大括号
{}
和dict()
创建,键值对用冒号:
表示;type(x)
:返回变量x的类型;
6.4.2 处理函数及方法
函数或方法 | 描述 |
---|---|
del d[k] | 删除字典d中键k对应的数据值 |
k in d | 判断键k是否在字典d中,如果在返回True,否则False |
d.keys() | 返回字典d中所有的键信息 |
d.values() | 返回字典d中所有的值信息 |
d.get(k,<default>) | 键k存在,则返回相应值,不在则返回<default>值 |
d.pop(k,<default>) | 键k存在,则取出相应值,不在则返回<default>值 |
d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
d.clear() | 删除所有的键值对 |
len(d) | 返回字典d中元素的个数 |
6.4.3 应用场景
映射的表达;表达键值对数据,进而操作它们;
6.5 jieba库介绍
6.5.1 概述
中文分词第三方库;
6.5.2 jieba分词的三种模式
- 精确模式:把文本精确的切分开,不存在冗余单词;全模式:把文本中所有可能的词语都扫描出来,有冗余;搜索引擎模式:在精确模式基础上,对长词再次切分;
- 常用函数
函数 | 描述 | 举例 |
---|---|---|
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 | jieba.lcut("中国是一个伟大的国家"):['中国','是','一个','伟大','的','国家'] |
jieba.lcut(s,cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 | jieba.lcut("中国是一个伟大的国家",cut_all=True):['中国','国是','一个','伟大','的','国家'] |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 | jieba.lcut_for_search("中华人民共和国是伟大的"):['中华','华人','人民','共和','共和国','中华人民共和国','是','伟大','的'] |
jieba.add_word(w) | 向分词词典增加新词w | jieba.add_word("蟒蛇语言") |
6.6 实例10:文本词频统计
6.6.1 问题分析
在英文中文中,出现哪些词,出现多少次?
6.6.2 hamlet英文词频统计
- CalHamletV1.py
6.6.3 三国演义人物出场统计
- 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() #采用空格将字符串中的信息进行分隔,以列表形式返回给变量
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) #对一个列表按照键值对的2个元素的第2个元素进行排序,排序方式为由大到小的倒排
for i in range(10): #将前10位字数打印输出
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 三国演义人物出场文本统计
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
关公 509
丞相 488
二人 465
不可 435
荆州 420
孔明曰 385
玄德曰 383
不能 383
如此 376
张飞 348
#CalThreeKingdomsV2.py 三国演义人物出场文本统计
import jieba
txt = open("E:/python/learn/threekingdoms.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 =="关公" 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(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
曹操 1429
孔明 1373
刘备 1223
关羽 779
张飞 348
商议 344
如何 336
主公 327
军士 310
吕布 300
左右 291
军马 288
次日 270
引兵 269
大喜 265
点赞,关注,收藏👍,➕,👀点赞,关注,收藏👍,➕,👀点赞,关注,收藏👍,➕,👀
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘
💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪