组合数据类型
一、集合类型及操作
1.集合类型
-集合元素间无序,每个元素唯一,集合元素不能是可变数据类型
-使用{}或set函数建立集合
2.集合操作符
①并 | ②差 - ③交 & ④补 ^
⑤ <=、< ⑥ >=、>
⑦增强操作符
- S |= T:更新集合S,包含集合S和T中的所有元素
- S -= T,更新集合S,包括在集合S但不在T中的元素
- S &=T,更新集合S,包括同时在集合S和T中的元素
- S ^= T,更新集合S,包括集合S和T中的非相同元素
3.集合处理方法
① .add(x):将x加入到集合中
② .discard(x):从集合中移除x,若集合中不存在x,不报错
③ .remove(x):从集合中移除x,若集合中不存在x,产生KeyError异常
④ .clear():移除集合中所有元素
⑤ .pop():随机返回集合一个元素,更新集合,若集合为空产生KeyError异常
⑥ .copy():返回集合的一个副本
⑦ len(S):返回集合S的元素个数
⑧ x in S:判断x是否在集合S中,在返回True
⑨ x not in S:判断x是否在集合S中,不在返回True
⑩ set(x):将其他类型变量x转变为集合类型
for … in方式遍历组合:
>>> A={"p","y",123}
>>> for item in A:
print(item,end="")
123py
while方式遍历组合:
>>> A={"p","y",123}
>>> try:
while True:
print(A.pop(),end="")
except:pass
123py
二、序列类型及操作(元组/列表)
1.序列定义
①序列:具有先后关系的一组元素,是一维元素变量,元素类型可不同
②序列的分类
- 字符串类型
- 元组类型
- 列表类型
③反向递减序号、正向递增序号
2.序列处理函数及方法
①六个操作
②五个函数
-len(s):返回s长度
-min(s):返回s中最小元素
-max(s):返回s中最大元素
s.index(x)或s.index(x,i,j):返回s从i开始到j位置中第一次出现x的位置
元组类型及其操作
-使用小括号()或tuple()创建,元素间用逗号分隔
-创建后不能修改
>>> creature = "cat","dog","rabbit","human"
>>> color = (0x001100,"blue",creature)
>>> creature
('cat', 'dog', 'rabbit', 'human')
>>> color
(4352, 'blue', ('cat', 'dog', 'rabbit', 'human'))
列表类型及其操作
-使用方括号[]或list()创建,元素间用逗号分隔
-创建后可以随意修改
-列表操作
- ls[i]=x
- ls[i:j:k]=lt:使用列表lt替换ls切片后所对应元素子列表
- del ls[i]
- del ls[i:jK]:删除列表ls中第i到j以k为步长的元素
- ls+=lt:更新ls,将lt增加到ls中
- ls*=n:更新ls,将其元素重复n次
>>> ls=["00","11","22","33",44]
>>> ls[1:2]=["a","b","c","d"] #替换
>>> ls
['00', 'a', 'b', 'c', 'd', '22', '33', 44]
>>> del ls[::3] #删除列表ls中以3为步长的子序列
>>> ls
['a', 'b', 'd', '22', 44]
-列表函数或方法
- .appen(x):在列表ls最后添加元素x
- .clear():删除ls所有元素
- .copy():生成一个新列表,赋值ls中所有元素
- .insert(i,x):在列表ls第i位置增加元素x
- .pop(i):取出ls第i位置元素并删除
- .remove(x):将ls中出现的第一个元素x删除
- sorted(s):列表排序
三、实例9:基本统计值计算
1.分析
求总个数、求和、平均值、方差、中位数
2.代码
#CalStatistics.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+=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
def main():
n=getNum()
m=mean(n)
print("平均值:{},方差:{},中位数:{}".format(m,dev(n,m),median(n)))
main()
请输入数字(回车退出):1
请输入数字(回车退出):5
请输入数字(回车退出):2
请输入数字(回车退出):8
请输入数字(回车退出):9
请输入数字(回车退出):11
请输入数字(回车退出):4
请输入数字(回车退出):
平均值:5.714285714285714,方差:3.728908942943218,中位数:8
四、字典类型及操作
1.字典类型定义
-键值对:键是数据索引的扩展
-字典是键值对的集合,键值对之间无序
-采用大括号{}和dict()创建,键值对用冒号:表示
(集合和字典都用{}表示,但集合不能直接使用{}生成,字典可以)
>>> d={"中国":"北京","美国":"华盛顿","法国":"巴黎"}
>>> d["中国"]
'北京'
>>> dd={} #创建空字典
>>> type(dd)
<class 'dict'>
2.字典类型处理函数及方法
- del d[k]:删除字典d中键k对应的数据值
- k in d:判断键k是否存在于字典中
- .keys():返回字典d中所有的键信息
- .values():返回字典d中所有的值信息
- .items():返回字典d中所有的键值对信息
- .get(k,):若k存在返回对应值,不存在则返回值
- .pop(k,):若k存在取出对应值,不存在则返回值
- .popitem():随即从字典d中取出一个键值对,以元组形式返回
- .clear():删除所有的键值对
- len(d):返回字典d中元素个数
五、模块5:jieba库的使用
1.jieba库
①中文分词第三方库,需要额外安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
②利用中文词库,确定汉字之间的关联概率,汉字间概率大的组成词组,形成分词结果。除了分词,用户还可以添加自定义的词组。
2.三种模式
- 精确模式:把文本精确的切分开,不存在冗余单词
- 全模式:把文本中所有可能的词语都扫描出来,有冗余
- 搜索引擎模式:在精确模式基础上,对长词再次切分
3.常用函数
① .lcut(s):精确模式,返回一个列表类型的分词结果
② .lcut(s,cut_all=True):全模式分词,存在冗余
③ .lcut_for_search(s):搜索引擎模式,存在冗余
④ .add_word(w):向分词词典增加新词w
六、实例10:文本词频统计
1.Hamlet英文词频统计
#CalHamletV1.py
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
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))
2.《三国演义》人物出场统计
#CalThreeKingdomsV2.py
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:
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]
print ("{0:<10}{1:>5}".format(word, count))