python程序设计及大数据挖掘-第五次课
9.1
# 导入数学库中的平方根函数
from math import sqrt
# 定义getNum函数:用于获取用户的不定长输入
def getNum():
nums = [] # 初始化一个空列表,用于存储用户输入的数字
iNumStr = input("请输入数字(直接输入回车退出): ") # 获取用户输入的数字字符串
while iNumStr != "": # 当用户输入不为空时,继续循环
nums.append(eval(iNumStr)) # 将用户输入的数字字符串转化为数字,并添加到nums列表中
iNumStr = input("请输入数字(直接输入回车退出): ") # 再次获取用户输入
return nums # 返回存储了所有用户输入数字的列表
# 定义mean函数:用于计算数字列表的平均值
def mean(numbers):
s = 0.0 # 初始化累加器为0
for num in numbers: # 遍历数字列表
s = s + num # 将每个数字累加到累加器中
return s / len(numbers) # 返回累加器除以数字列表的长度,即平均值
# 定义dev函数:用于计算数字列表的方差
def dev(numbers, mean):
sdev = 0.0 # 初始化方差累加器为0
for num in numbers: # 遍历数字列表
sdev = sdev + (num - mean)**2 # 计算每个数字与平均值的差的平方,并累加到方差累加器中
return sqrt(sdev / (len(numbers)-1)) # 返回方差累加器除以(数字列表长度-1)的平方根,即方差
# 定义median函数:用于计算数字列表的中位数
def median(numbers):
sorted(numbers) # 对数字列表进行排序,但这里缺少将排序结果重新赋值给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() # 调用getNum函数,获取用户输入的数字列表
m = mean(n) # 调用mean函数,计算数字列表的平均值
# 输出结果
print("平均值:{},方差:{:.2f},中位数:{}.".format(m, dev(n,m),median(n))) # 打印平均值、方差和中位数,注意方差格式化为两位小数
10.1
# 定义一个函数getText,用于从文件中读取文本内容并进行预处理
def getText():
# 打开名为"hamlet.txt"的文件,并以只读模式读取文件内容,赋值给变量txt
txt = open("hamlet.txt", "r").read()
# 将文本内容转换为小写,以便后续的统计不受大小写影响
txt = txt.lower()
# 遍历定义的特殊字符集合
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
# 将文本中的特殊字符替换为空格,以便于后续的单词分割
txt = txt.replace(ch, " ")
# 返回预处理后的文本内容
return txt
# 调用getText函数,并将返回的文本内容赋值给变量hamletTxt
hamletTxt = getText()
# 使用空格分割处理后的文本,得到一个包含所有单词的列表
words = hamletTxt.split()
# 定义一个空字典counts,用于统计单词出现的次数
counts = {}
# 遍历单词列表
for word in words:
# 使用字典的get方法获取单词word的当前计数,默认为0
# 然后将计数加1,并更新到字典counts中
counts[word] = counts.get(word,0) + 1
# 将counts字典的键值对转换为列表items
items = list(counts.items())
# 对items列表进行排序,按照单词出现的次数从多到少排序
# 使用lambda函数作为排序的key,提取每个元组的第二个元素(即计数)
items.sort(key=lambda x:x[1], reverse=True)
# 遍历排序后的前10个单词及其计数
for i in range(10):
# 从items列表中提取第i个元素,并解包为word和count两个变量
word, count = items[i]
# 使用格式化字符串打印单词及其计数,左对齐单词占10个字符宽度,右对齐计数占5个字符宽度
print ("{0:<10}{1:>5}".format(word, count))
10.2
# 定义一个集合excludes,包含一些不需要统计的常用单词
excludes = {"the","and","of","you","a","i","my","in"}
# 定义getText函数,用于从文件读取并处理文本内容
def getText():
# 打开名为"hamlet.txt"的文件,以只读模式读取内容,并赋值给变量txt
txt = open("hamlet.txt", "r").read()
# 将文本内容转换为小写
txt = txt.lower()
# 遍历定义的特殊字符集合
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
# 将文本中的特殊字符替换为空格
txt = txt.replace(ch, " ")
# 返回处理后的文本内容
return txt
# 调用getText函数,并将返回的文本内容赋值给变量hamletTxt
hamletTxt = getText()
# 使用空格分割处理后的文本,得到一个包含所有单词的列表
words = hamletTxt.split()
# 定义一个空字典counts,用于统计单词出现的次数
counts = {}
# 遍历单词列表
for word in words:
# 如果单词已经在counts字典中,则增加其计数;否则,设置其计数为1
counts[word] = counts.get(word,0) + 1
# 遍历excludes集合,从counts字典中删除这些不需要统计的单词
for word in excludes:
del(counts[word])
# 将counts字典的键值对转换为列表items
items = list(counts.items())
# 对items列表进行排序,按照单词出现的次数从多到少排序
items.sort(key=lambda x:x[1], reverse=True)
# 遍历排序后的前10个单词及其计数
for i in range(10):
# 解包items列表中的第i个元素,分别赋值给word和count
word, count = items[i]
# 使用格式化字符串打印单词及其计数,左对齐单词,右对齐计数
print ("{0:<10}{1:>5}".format(word, count))
10.3
# 导入jieba分词库
import jieba
# 定义一个空字典excludes,用于存储需要排除的单词,此处未初始化任何单词
excludes = {} #{"将军","却说","丞相"} # 示例中排除了三个词,但在当前代码中未实际排除
# 打开名为"三国演义.txt"的文件,以只读模式读取内容,并指定编码为utf-8,然后将内容赋值给变量txt
txt = open("三国演义.txt", "r", encoding='utf-8').read()
# 使用jieba的lcut函数对文本txt进行分词,得到一个包含所有单词的列表,赋值给变量words
words = jieba.lcut(txt)
# 定义一个空字典counts,用于统计单词出现的次数
counts = {}
# 遍历单词列表words
for word in words:
# 如果单词的长度为1(即单个字符),则跳过不统计
if len(word) == 1:
continue
else:
# 否则,如果单词已经在counts字典中,则增加其计数;否则,设置其计数为1
counts[word] = counts.get(word,0) + 1
# 遍历excludes字典(当前为空),从counts字典中删除这些不需要统计的单词
# 注意:因为excludes为空,所以此循环实际上不会执行任何操作
for word in excludes:
del(counts[word])
# 将counts字典的键值对转换为列表items
items = list(counts.items())
# 对items列表进行排序,按照单词出现的次数从多到少排序
items.sort(key=lambda x:x[1], reverse=True)
# 遍历排序后的前15个单词及其计数
for i in range(15):
# 解包items列表中的第i个元素,分别赋值给word和count
word, count = items[i]
# 使用格式化字符串打印单词及其计数,左对齐单词,右对齐计数
print ("{0:<10}{1:>5}".format(word, count))
10.4
# 导入jieba分词库
import jieba
# 定义一个包含需要排除的单词的集合
excludes = {"将军", "却说", "荆州", "二人", "不可", "不能", "如此"}
# 打开名为"三国演义.txt"的文件,以只读模式读取内容,并指定编码为utf-8
txt = open("三国演义.txt", "r", encoding='utf-8').read()
# 使用jieba的lcut函数对文本txt进行分词,得到一个包含所有单词的列表
words = jieba.lcut(txt)
# 定义一个空字典counts,用于统计单词出现的次数
counts = {}
# 遍历单词列表words
for word in words:
# 如果单词的长度为1(即单个字符),则跳过不统计
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字典中
counts[rword] = counts.get(rword, 0) + 1
# 遍历excludes集合,从counts字典中删除这些不需要统计的单词
for word in excludes:
del(counts[word])
# 将counts字典的键值对转换为列表items
items = list(counts.items())
# 对items列表进行排序,按照单词出现的次数从多到少排序
items.sort(key=lambda x: x[1], reverse=True)
# 遍历排序后的前5个单词及其计数
for i in range(5):
# 解包items列表中的第i个元素,分别赋值给word和count
word, count = items[i]
# 使用格式化字符串打印单词及其计数,左对齐单词,右对齐计数
print("{0:<10}{1:>5}".format(word, count))
版权声明:
作者:夜阑
链接:http://yelan.xyz/index.php/2024/03/28/python%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e5%8f%8a%e5%a4%a7%e6%95%b0%e6%8d%ae%e6%8c%96%e6%8e%98-%e7%ac%ac%e4%ba%94%e6%ac%a1%e8%af%be/
来源:夜阑的小站
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
共有 0 条评论