第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,...,sn−1
序列是一个基类类型。
序列类型:字符串类型,元组类型,列表类型。
序号的定义。
正向递增序号,反向递减序号
序列处理函数及方法
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))
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
