第6周 组合数据类型

目录

        • 6.1 集合类型及操作
        • 6.2 序列类型及操作
        • 6.3 实例9:基本统计值计算
        • 6.4 字典类型及操作
        • 6.5 jieba库的使用
        • 6.6 实例10:文本词频统计

6.1 集合类型及操作

使用lambda定义匿名函数。
Python三种主流组合数据类型的使用方法。

集合类型定义:多个元素的无序组合。和数学概念中的集合一致。不可变数据类型,不能被修改。
集合类型要求元素独一无二。
集合用大括号{}表示,元素用逗号分隔。
使用set()建立集合

B = set("pypy123")

集合操作符
并,差,交,补

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.add(x)
S.discard(x) #即便x不在S中,也不会报错
S.remove(x)  #如果x不在S中,会报错
S.clear()
S.pop()  #随机删除一个元素,且返回该元素的值
S.copy()
len(S)
x in S #判断x是否在S中
x not in S  #
set(x)  #将其它类型变量转换成集合类型

集合类型应用场景
包含关系的比较

"p" in {"p", "y", 123}
{"p", "y"} >= {"p", "y", 123}

数据去重

ls = ["p", "p", "y", "y", 123]  #列表
s = set(ls)   #利用集合无重复元素的特点
lt = list(s)  
6.2 序列类型及操作

序列类型及操作
序列是具有先后关系的一组元素。
序列是一维元素向量,元素类型可以不同。
类似数学元素序列: s 0 , s 1 , . . . , s n − 1 s_0,s_1,...,s_{n-1} s0,s1,...,sn1
序列是一个基类类型。
序列类型:字符串类型,元组类型,列表类型。

序号的定义。
正向递增序号,反向递减序号

序列处理函数及方法
6个操作符

x in s
x not in s
s + t
s * n 或 n * s
s[i]
s[i:j:k]  #切片

注意s[::-1]返回翻转之后的序列

5个函数和方法

len(s)
min(s)
max(s)
s.index(x) 或 s.index(x,i,j)  #返回元素x第一次出现的序号
s.count(x)

元组类型定义
元组是一种序列类型,一旦创建就不能被修改
使用小括号()或tuple()创建,元素间用逗号分隔
可以使用或不使用小括号

列表类型定义
列表是一种序列类型,创建后可以随意被修改
使用方括号[]或list()创建,元素间用逗号,分隔
列表中各元素类型可以不同,无长度限制
赋值,重新命名

ls[i] = x
ls[i:j:k] = lt
del ls[i]
del ls[i:j:k]  #对j而言,不包含它;对k而言,以0开始编号
ls += lt  #注意:加号表示合并两个列表!!!
ls *= n

列表类型操作函数和方法

ls.append(x)  #在它后面增加一个元素
ls.clear()
ls.copy()
ls.insert(i,x)  #在第i位置增加元素x
ls.pop(i)
ls.remove(x)  #删除元素x,若有多个x,只删除第一个
ls.reverse()  #翻转列表

序列类型的应用场景:用于数据表示
数据保护:定义元组类型

lt = tuple(ls)
6.3 实例9:基本统计值计算

总个数,求和,平均值,方差,中位数

len()   #总个数
for ... in  #求和
#CalStatisticsV1.py
def getNum():nums = []  #列表,不定长度的输入iNumStr = input("请输入数字(回车退出):")while iNumStr != "":nums.append(eval(iNumStr))iNumStr = input("请输入数字(回车退出):")return numsdef mean(numbers):s = 0.0for num in numbers:s = s + numreturn s / len(numbers)def dev(numbers, mean):sdev = 0.0for num in numbers:sdev = sdev + (num - mean) ** 2return pow(sdev / (len(numbers) - 1), 0.5)def median(numbers):numbers = sorted(numbers)size = len(numbers)if size % 2 == 0:med = (numbers[size//2-1] + numbers[size//2]) / 2else:med = numbers[size//2]return med
6.4 字典类型及操作

字典类型定义:
映射是一种键(索引)和值(数据)的对应。
字典是键值对的集合,键值对无序。
采用大括号{}和dict()创建,键值对用冒号:表示
使用type(x)检测任何变量x的类型

字典处理函数及方法

del d[k]  #删除字典d中键k对应的数据值
k in d
d.keys()  #返回字典d中所有的键信息
d.values()  #返回字典d中所有的值信息
d.items()  #返回字典d中所有的键值对信息
d.get(k,<default>)  #键k存在,则返回相应值,不在则返回
d.pop(k,<default>)  #键k存在,则取出相应值,不在则返回
d.popitem()  #随机从字典d中取出一个键值对,以元组形式返回
d.clear()
len(d)

利用get()方法来更新哈希表,d[key] = d.get(key, 0) + 1,这经常使用,请留意。

利用for (key, val) in d.items():来遍历哈希表。

通过赋值来新增元素。

d["a"] = 1
d["b"] = 2

判断字符"c"是否是d的键

"c" in d

字典类型的应用场景
统计数据的出现次数。
元素遍历

for k in d:  #k是键
6.5 jieba库的使用

jieba是优秀的中文分词第三方库。
jieba库提供了三种分词模式:精确模式、全模式、搜索引擎模式

pip install 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

#CalHamletV1.py
def getText():txt = open("hamlet.txt", "r").read()txt = txt.lower()for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':txt = txt.replace(ch, " ")return txthamletTxt = 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
txt = open("threekingdoms.txt", "r", encoding = "utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:if len(word) == 1:continueelse: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))

词频统计 ⇒ \Rightarrow 人物出场

#CalThreeKingdomsV2.py
import jieba
txt = open("threekingdoms.txt", "r", encoding = "utf-8").read()
excludes = {"将军", "却说", "荆州", "二人", "不可", "不能", "如此"}
words = jieba.lcut(txt)
counts = {}
for word in words:if len(word) == 1:continueelif word == "诸葛亮" or word == "孔明曰":rword = "孔明"elif word == "关公" or word == "云长":rword = "关羽"elif word == "玄德" or word == "玄德曰":rword = "刘备"elif word == "孟德" or word == "丞相":rword = "曹操"else:rword = wordcounts[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))


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部