【2023】某python语言程序设计跟学第六周内容
目录
1.集合类型及操作
1.1.集合类型定义
集合是多个元素的无序组合
-
集合类型与数学中集合概念一致
-
集合元素之间无序,每个元素唯一,不存在相同元素
-
集合元素不可修改,不能是可变数据类型
-
集合用{}表示,元素之间用逗号分隔
-
建立集合类型用{}或set()
-
建立空集合类型,必须使用set()
1.2.集合操作符
集合间有多种操作,常见集合间运算分别为并(|)、交(&)、差(-)、补(^)运算
Python集合有多种集合间运算,以下是常见的集合间运算:
-
并集:使用
|
或union()
方法。将两个集合中的所有元素合并成一个集合,不会重复。set1 = {1, 2, 3} set2 = {3, 4, 5} set3 = set1 | set2 # 或者 set4 = set1.union(set2) print(set3) # {1, 2, 3, 4, 5} print(set4) # {1, 2, 3, 4, 5}
-
交集:使用
&
或intersection()
方法。返回两个集合中都包含的元素组成的集合。set1 = {1, 2, 3} set2 = {3, 4, 5} set3 = set1 & set2 # 或者 set4 = set1.intersection(set2) print(set3) # {3} print(set4) # {3}
-
差集:使用
-
或difference()
方法。返回第一个集合中有但第二个集合中没有的元素组成的集合。set1 = {1, 2, 3} set2 = {3, 4, 5} set3 = set1 - set2 # 或者 set4 = set1.difference(set2) print(set3) # {1, 2} print(set4) # {1, 2}
-
补集:使用
^
或symmetric_difference()
方法。返回两个集合中不同的元素组成的集合。set1 = {1, 2, 3} set2 = {3, 4, 5} set3 = set1 ^ set2 # 或者 set4 = set1.symmetric_difference(set2) print(set3) # {1, 2, 4, 5} print(set4) # {1, 2, 4, 5}
这些集合间运算都是基于集合的数学概念而来,可以方便地处理集合中的元素。
除此之外还有(<=、<、>=、>)判断子集关系或包含关系
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(x):移除S中所有元素
- S.pop(x):随机返回一个元素,更新S,若S为空产生KeyError异常
- S.copy():返回集合S的一个副本
- len(S):返回集合S的元素个数
- x in S:判断S中元素x,x在集合中,返回True,否则返回False
- x not in S:判断S中元素x,x不在集合中,返回True,否则返回False
- set(x):将其他类型变量x转变为集合类型
1.4.集合类型应用场景
数据去重:集合类型的元素不重复,可用于去除列表等其他集合类型中的重复元素。
ls = ["p", "p", "y", "y", 123]
s = set(ls)
print(s)lt = list(s)
print(s)# 输出
{'p', 123, 'y'}
{'p', 123, 'y'}
其他场景还有包括:
- 集合运算:集合类型支持包括交集、并集、差集等多种集合运算,可用于对多个集合进行操作。
- 成员检查:集合类型支持快速的成员检查,可用于判断一个元素是否在集合中。
- 缓存:集合类型支持快速的添加、删除、查找等操作,可用于缓存数据。
- 数学计算:集合类型支持数学中的集合操作,如求并集、交集等。
- 过滤数据:集合推导式可用于过滤数据,筛选满足条件的元素。
2.序列类型及操作
2.1.序列类型定义
序列是具有先后关系的一组元素
- 序列是一维元素向量,元素类型可以不同
- 类似于数学元素序列
- 元素间由序号引导,通过下标访问序列的特定元素
序列是一个基类类型,不会直接使用序列类型,而是使用他的衍生类型:字符串类型、元组类型、列表类型
在Python中,序列类型的序号从0开始,表示序列中的第一个元素。例如,对于一个包含3个元素的列表,第一个元素的序号为0,第二个元素的序号为1,第三个元素的序号为2。可以使用方括号索引来获取序列中的特定元素,例如:
my_list = [1, 2, 3]
print(my_list[0]) # 输出1
print(my_list[1]) # 输出2
print(my_list[2]) # 输出3
反向从(-1)开始
2.2.序列处理函数及方法
Python中序列类型操作符包括:
- 索引操作符([]):用于获取序列中指定位置的元素,索引从0开始。
- 切片操作符([:]):用于获取序列中指定范围的元素,包括起始位置,但不包括结束位置。
- 连接操作符(+):用于连接两个序列,生成一个新的序列。
- 重复操作符(*):用于将序列重复多次,生成一个新的序列。
- 成员操作符(in):用于检查指定元素是否在序列中。
- 长度操作符(len()):用于获取序列的长度。
这些操作符的含义和使用方法可以根据具体的序列类型(如字符串、列表、元组等)来进行理解和应用。
序列类型中通用函数及方法:
通用函数:
- len(seq):返回序列的长度。
- min(seq):返回序列中的最小值。
- max(seq):返回序列中的最大值。
- sum(seq):返回序列中所有元素的和。
- any(seq):如果序列中的任意一个元素为True,则返回True;否则返回False。
- all(seq):如果序列中的所有元素都为True,则返回True;否则返回False。
方法:
- seq.count(x):返回元素x在序列中出现的次数。
- seq.index(x):返回元素x在序列中第一次出现的索引。
- seq.append(x):将元素x添加到序列的末尾。
- seq.insert(i, x):将元素x插入到序列中索引为i的位置。
- seq.pop():从序列中删除最后一个元素,并返回该元素的值。
- seq.remove(x):从序列中删除第一个出现的元素x。
- seq.reverse():将序列中的元素反转。
- seq.sort():将序列中的元素按照一定规则排序。
2.3.元组类型定义
元组是序列类型的一种扩展
- 元组是一种序列类型,一旦创建就不能被修改
- 使用小括号()或tuple()创建,元素间用逗号,分隔
- 可以使用或不适应小括号
元组类型操作:
元组继承序列类型的全部通用操作
- 元组继承了序列类型的全部通用操作
- 元组因为创建后不能修改,因此没有特殊操作
- 使用或不使用小括号
2.4.列表类型及操作
列表是序列类型的一种扩展,十分常用
- 列表是一种序列类型,创建后可以随意被修改
- 使用[]或者list()创建,元素间用逗号,分隔
示例:定义一个列表
ls = ["cat", "dog", "tiger", 1024]
print(ls)
lt = ls
# 输出
['cat', 'dog', 'tiger', 1024]
['cat', 'dog', 'tiger', 1024]
此时lt并没有生成一个新列表,而是给ls列表增加一个名称
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 = ["cat", "dog", "tiger", 1024]
print(ls)
ls[1:2] = [1, 2, 3, 4]
print(ls)
del ls[::3]
print(ls)
print(ls*2)
# 输出
['cat', 'dog', 'tiger', 1024]
['cat', 1, 2, 3, 4, 'tiger', 1024]
[1, 2, 4, 'tiger']
[1, 2, 4, 'tiger', 1, 2, 4, 'tiger']
列表类型操作函数和方法:
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中出现的第一个元素x删除
ls.reverse():将列表ls中的元素反转
示例:
ls = ["cat", "dog", "tiger", 1024]
print(ls)
ls.append(1234)
print(ls)
ls.insert(3, "human")
print(ls)
ls.reverse()
print(ls)
# 输出
['cat', 'dog', 'tiger', 1024]
['cat', 'dog', 'tiger', 1024, 1234]
['cat', 'dog', 'tiger', 'human', 1024, 1234]
[1234, 1024, 'human', 'tiger', 'dog', 'cat']
2.5.序列类型应用场景
序列包括元组、列表两种重要的扩展类型
序列类型应用场景:
- 元组用于元素不改变的应用场景,更多用于固定搭配场景
- 列表更加灵活,它是最常用的序列类型
- 最主要作用:表示一组有序数据,进而操作它们
3.实例:基本统计值计算
基本统计值:
- 需求:给出一组数,对它们有个概要理解
- 该怎么做
总个数,求和,平均值,方差,中位数
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): #计算中位数sorted(numbers)size = len(numbers)if size % 2 == 0:med = (numbers[size//2-1] + numbers[size//2])/2else:med = numbers[size//2]return medn = getNum() #主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))
4.字典类型及操作
4.1.字典类型定义
理解“映射”
- 映射是一种键(索引)和值(数据)的对应
字典类型是“映射”的体现
- 键值对:键是数据索引的扩展
- 字典是键值对的集合,键值对之间无序
- 采用
{}
或dict()
创建,键值对用:
表示
d = {"中国":"北京", "美国":"华盛顿"}
print(d)
# 输出
{'中国': '北京', '美国': '华盛顿'}
4.2.字典处理函数及方法
函数及方法:
del d[k]:删除字典d中键k对应的数据值
k in d:判断键k是否在字典d中,如果在返回true,否则返回false
d.keys():返回字典d中所有的键信息
d.values():返回字典d中所有的值信息
d.items():返回字典d中所有的键值对信息
示例:
d = {"中国":"北京", "美国":"华盛顿"}
print(d)
print("中国" in d)
print(d.keys())
# 输出
{'中国': '北京', '美国': '华盛顿'}
True
dict_keys(['中国', '美国'])
dict_values(['北京', '华盛顿'])
列表类型操作函数和方法:
d.get(k, <default>):键k存在,则返回相应值,不在则返回<default>值
d.pop(k, <default>):键k存在,则取出相应值,不在则返回<default>值
d.popitem():随机从字典d中取出一个键值对,以元组形式返回
d.clear():删除所有键值对
示例:
d = {"中国":"北京", "美国":"华盛顿"}
print(d.get("中国", "汉堡包"))
print(d.get("炸薯条", "汉堡包"))
# 输出
北京
汉堡包
('美国', '华盛顿')
4.3.字典类型应用场景
映射的表达:
- 映射无处不在,键值对无处不在
- 例如:统计数据出现的次数,数据是键,次数是值
- 最主要作用:表达键值对数据,进而操作它们
5.jieba库概述
jieba是优秀的中文分词第三方库
- 中文文本需要通过分词获得单个的词语
- 需要额外安装
- jieba库提供三种分词模式,最简单的只需掌握一个函数
安装:在终端运行
pip install jieba
jieba分词需要依靠中文词库
- 利用一个中文词库,确定汉字之间的关联概率
- 汉字间概率大的组成词组,形成分词结果
- 除了词库,还可以添加自定义词组
jieba分词有三种模式
- 精确模式:把文本精确的切分开,不存在冗余单词
- 全模式:本文本中所有可能的词语都扫描出来,有冗余
- 搜索引擎模式:在精确模式基础上,对长词再次切分
jieba库常用函数:
jieba.cut(s): 分词函数,将文本分成一个个词语并返回一个可迭代的generator对象。
jieba.lcut(s): 精确模式,返回一个列表,包含分词结果中的所有词语。
jieba.lcut(s,cut_all=True):全模式,返回一个列表类型的分词结果,存在冗余
jieba.lcut_for_search(s): 适用于搜索引擎的分词函数,粒度比较细。
jieba.add_word(s): 向词典中添加新词。
6.实例:文本词频统计
文本词频统计
需求:一篇文章,出现了哪些词?哪些词出现的最多?
6.1.哈姆雷特统计
https://www.python123.io/resources/pye/hamlet.txt
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))
6.2.三国演义统计
https://www.python123.io/resources/pye/threekingdoms.txt
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: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))