python语言程序设计-中国大学MOOC
----------学习笔记(六)
集合类型
集合是多个元素的无序组合
-集合类型与数学中的集合概念一致
-集合元素之间无序,每个元素唯一,不存在相同元素
-集合元素不可更改,不能是可变数据类型
-集合用大括号{}表示,元素间用逗号分隔
-建立集合类型用{}或set()
-建立空集合类型,必须使用set()
集合操作
序列
序列是具有先后关系的一组元素
-序列是一维元素向量,元素类型可以不同
-类似数学元素序列
-元素间由序号引导,通过下标访问序列的特定元素
元组
元组是序列类型的一种扩展
-元组是一种序列类型,一旦创建就不能被修改
-使用小括号()或tuple()创建,元素间用逗号分隔
-可以使用或不适用小括号
def func():
return 1,2 #1,2本身就是一个元组
列表
列表是一种序列类型,创建后可以随意被修改
-列表是一种序列类型,创建后可以随意被修改
-使用方括号[]或list()创建,元素间用逗号分隔
-列表中各元素类型可以不同,无长度限制
序列类型应用场景
-元组用于元素不改变的应用场景,更多用于固定搭配场景
-列表更加灵活,它是最常用的序列类型
-最主要作用:表示一组有序数据,进而操作它们
元素遍历
for item in ls:
<语句块>
for item in tp:
<语句块>
基本统计值实例
#获得用户输入
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("平均值:{},方差:{:.2f},中位数:{}.".format(m,dev(n,m),median(n)))
字典
理解映射
-映射是一种键(索引)和值(数据)的对应
字典类型是映射的体现
-键值对:键是数据索引的扩展
-字典是键值对的集合,键值对之间无序
-采用大括号{}和dict()创建,键值对用冒号:表示
jieba库
jieba是优秀的中文分词第三方库
-中文文本需要通过分词获得单个的词语
-jieba是优秀的中文分词第三方库,需要额外安装
-jieba库提供三种分词模式,最简单只需掌握一个函数
jieba库安装 (cmd下)—pip install jieba
-利用一个中文词库,确定汉字之间的关联概率
-汉字间概率大的组成词组,形成分词结果
-除了分词,用户还可以添加自定义的词组
文本词频统计实例
#英文统计-哈姆雷特高频词
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))
#中文统计-三国演义人物出场
import jieba
txt=open("threekingdoms.txt","r",encoding="utf-8").read()
words=jieba.lcut(txt)
counts={}
for word in words:
if len(word)==1:
continue
else:
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))
#中文统计改进
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(15):
word,count=items[i]
print("{0:<10}{1:>5}".format(word,count))