文章目录
三种集合数据类型:集合、序列(字符串、元组、列表)、字典
第六周 组合数据类型
集合类型及操作
-
定义:唯一、无序、用{}表示
创建字典时,如果相同键对应不同值,字典采用最后(最新)一个"键值对"
因为元素唯一所以不可变,列表可改变
注意set是把每一个字母当一个元素拆开,{}是按逗号分开元素 -
集合操作符
-
增加操作符:用=同时更新S
例子:
-
集合的处理方法
用‘.’调用方法
产生异常可以用try…except捕捉
例子:
注意集合是无序的,也就是在存储中的顺序和代码写的顺序不相同,程序员无法获知,也就是无序的
除了for in 以外,while的遍历方法:
这是从前面的A集合不断取出元素,当取完就会产生异常,try语句捕捉异常进而跳出while死循环
for in语句为主 -
集合类型应用场景
关系比较
数据去重:利用集合唯一性
将列表变成集合再变回去
序列类型及操作(字符串、元组、列表)
- 定义:具有先后关系,元素类型可以不同,是一个基类型,它的所有操作,字符串,元组,列表都可以用
- 序列处理函数及方法
原PPT写错啦哈哈,s[::-1]是相反取出
index函数也就是在部分或整体范围内查找x元素并返回其下标/索引
s.index(x)返回第一次出现x的序号,并不返回全部序号。
例子:
元组类型及操作
- 定义:不可修改、用=()或不加()或tuple()创建
return 的其实就是一个元组类型
例子:
注意[::-1]并不改变原来元组值而是生成一个新的元组值
列表类型及操作
- 定义:== 可修改,[]或list()创建==
例子:
lt类似取别名,并没有再系统中再生成新列表
只有用[]或list()才是真正创建了一个列表,如果用=等价于取别名
- 操作函数
例子:将从1-2号元素替换为xx序列、删除以3为步长的元素(036)、翻倍
列表类型的方法:
例子:
注意insert是在第几号元素之后添加(毕竟第0号就只能在之后添加嘛)
总结:
添加:一个append inset 多个+=[1,2,3]
删除:一个pop remove 多个del ls[i:j:k]
序列应用场景
实例9:基本统计值计算
基本统计值:总个数,求和,平均值,方差,中位数等
#获取用户输入,返回一个列表(不确定多个)
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)))
字典类型及操作
- 定义:是自定义索引的键值对,键值对之间无序,用{}或dict()创建,键值时间用:表示
例子:通过中国这个索引查找并返回北京这个值
类似a[0]不过是0是自定义
用{}默认生成一个空字典,与集合不同的是{}里面的键值对,所以空集合不能用{}来生成,用set()来生成空集合
- 字典类型的操作函数和方法
例子:
注意返回的是字典的key/value类型,不是列表类型,可以用for…in做遍历
例子:
注意:popitem是随机抽一个键值对,同时有从字典里面删除掉,返回的是元组类型
例子:新增用=
- 字典的应用场景
模块5:jieba库
- jieba库的使用
搜索引擎模式是在精确模式的基础上增加长词的分词
实例10:文本词频统计
需求:分许一篇文章出现的词,出现最多的词,包括中英文
英文哈姆雷特
https://python123.io/resources/pye/hamlet.txt
中文三国演义
https://python123.io/resources/pye/threekingdoms.txt
下面是哈姆雷特词频统计。
#计算文章里面的词频
#对文件的去噪处理
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#遍历每一个单词,如如果字典中已经存在就把它对应的值+1,否则返回0再+1
items=list(counts.items())#把字典变成列表类型
items.sort(key=lambda x:x[1],reverse=True)#指定排序列(按键值对的值排序),设定返回的排序从大到小
for i in range(10):
word,count=items[i]#将词频排序前10的键值对打印出来
print("{0:<10}{1:>5}".format(word,count))
下面是三国演义出场人物统计
#用jieba库统计三国演义出场人物
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:
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]#将词频排序前10的键值对打印出来
print("{0:<10}{1:>5}".format(word,count))
由于发现运行结果要剔除很久,所以就懒得再增加啦
注意:
若使用cmd安装jieba库却用pycharm进行编译运行,需要更改解释器为源python安装路径的那个(由于本人从pycharm里面安装一直不成功所以用这种方法)
详见关于pip安装第三方库,但PyCharm中却无法识别的问题;以及PyCharm安装第三方库的方法解析.