这周讲解了组合数据类型,重点介绍表达和处理一组数据的方法,涉及到多种数据类型,包括:集合类型、序列类型(含元组类型和列表类型)和字典类型;讲解2个颇有用处的实例:基本统计值计算和文本词频统计,其中,即有英文Hamlet的词频统计,也有中文《三国演义》的人物出场统计;进一步讲解用于中文分词的jieba库,从此以后,处理中英文文本、做些统计分析将不再是问题!
描述:
获取以逗号分隔的多个数据输入(输入为一行),计算基本统计值(平均值、标准差、中位数),除中位数外,其他输出保留小数点后两位。
注意:
多个数据是一行输入,而不是教程中的多行输入
我的代码:
#第6周week6_1.py
#请在...补充一行或多行代码
#CalStatisticsV1.py
#获取以逗号分隔的多个数据输入(输入为一行),
def getNum(): #获取用户不定长度的输入
Nums=[]
iNumStr=input()
Nums = iNumStr.split(',')
for i in range(len(Nums)):
Nums[i]=eval(Nums[i])
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): #计算中位数
nu=sorted(numbers)
num =len(numbers)
if num % 2 == 0:
med = (nu[num//2-1] +nu[num//2])/2
else:
med = nu[num//2]
return med
n = getNum() #主体函数
m = mean(n)
print("平均值:{:.2f},标准差:{:.2f},中位数:{}".format(m,dev(n,m),median(n)))
描述:
这是"实例"题,与课上讲解实例相同,请作答检验学习效果。
文本词频统计::一篇文章,出现了哪些词?哪些词出现的最多?
英文文本:hamlet.txt,参考附件
请统计hamlet.txt文件中出现的英文单词情况,统计并输出出现最多的10个单词,注意:
(1) 单词不区分大小写,即单词的大小写或组合形式一样;
(2) 请在文本中剔除如下特殊符号:!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~
(3) 输出10个单词,每个单词一行;
(4) 输出单词为小写形式。
输出样例:
以下仅是输出样例(仅列出3个,需要列出10个),不是最终结果:
the
hamlet
be
我的代码:
#week6_2.py
#请在...处补充代码
def getText():
txt = open("hamlet.txt", "r").read() #这是需要先记住的
txt = txt.lower()
for chr in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(chr,"")
return txt
hamletTxt = getText() #获取文本,文章形式
words = hamletTxt.split() #分割文章中单词,以列表形式表示
nums={} #定义一个字典,用以存单词及其个数
for word in words: #对于列表形式文章中的每个单词
nums[word] =nums.get(word,0)+1 #如果这个单词(键)在字典中,其值+1,不在则赋以0
items = list(nums.items()) #将字典变换为列表
items.sort(key=lambda x:x[1],reverse=True) #按多元数据的第二项(值)对列表进行排序,记!
for i in range(10):
word,num = items[i] #将列表中的二元数据分别赋值给word、num
# print("{0:<10}{1:>5}".format(word,num))
print(word) #练习只要求打印出单词,不需要打印对应的次数
描述:
编程模板中给出了一个字符串,其中包含了含有重复的人名,请去重后给出独特性人名的统计。
输出模板中字符串共有多少个独特人名。
我的代码:
#week6_3.py
#人名去重
#思路:利用集合元素的不重复
s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖
杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙
金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍
鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰
阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰
乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王
忽必烈 慕容复 张三丰 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正
李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复
逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣
洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复
黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄
张三丰 令狐冲 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫
洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈
完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱
郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲
谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉
双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏
逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄'''
s1=s.split()
st1=set(s1)
print(len(st1))
描述:
读入一个字典类型的字符串,反转其中键值对输出。
即,读入字典key:value模式,输出value:key模式。
输入格式:
用户输入的字典格式的字符串,如果输入不正确,提示:输入错误。
输出格式:
给定字典d,按照print(d)方式输出
输入输出示例:
输入 | 输出 | |
示例 1 | |
|
参考代码:
#week6_4.py
#反转输入字典的键与值
s = input()
try:
d = eval(s) #d是字典,可以用 for in 遍历
e = {} #一个空字典
for k in d: #遍历d
e[d[k]] = k #注意d[k]的用法,相当于自定义索引!,键值互换
print(e)
except:
print("输入错误")
描述:
附件是《沉默的羔羊》中文版内容,请读入内容,分词后输出长度大于2且最多的单词。
如果存在多个单词出现频率一致,请输出按照Unicode排序后最大的单词。
输入格式:
文件
输出格式:
字符串
我的代码:
#week6_5.py
#附件是《沉默的羔羊》中文版内容,请读入内容,分词后输出长度大于2且最多的单词。
#如果存在多个单词出现频率一致,请输出按照Unicode排序后最大的单词。
import jieba
txt = open("沉默的羔羊.txt","r",encoding='utf-8').read()
words = jieba.lcut(txt)
nums = {}
for word in words:
if len(word)<=2:
continue
else:
nums[word] =nums.get(word,0) + 1
items = list(nums.items())
items.sort(key=lambda x:x[0],reverse=True)
items.sort(key=lambda x:x[1],reverse=True)
print(items[0][0])
我不能确定两次排序的方法能否一定满足描述的第2条:“如果存在多个单词出现频率一致,请输出按照Unicode排序后最大的单词。”,但是通过的程序检测。
参考代码:
import jieba
f = open("沉默的羔羊.txt")
ls = jieba.lcut(f.read())
#ls = f.read().split()
d = {}
for w in ls:
d[w] = d.get(w, 0) + 1
maxc = 0
maxw = ""
for k in d:
if d[k] > maxc and len(k) > 2:
maxc = d[k]
maxw = k
if d[k] == maxc and len(k) > 2 and k > maxw:
maxw = k
print(maxw)
f.close()
说明:参考代码在电脑上不能正确运行,不知在平台上能否正确运行。
------------------------------------------------没有啦--------------------------------------------------------------