第六周学习:组合数据类型

1.集合类型及操作

1>集合类型定义
集合是多个元素的无序组合
—集合用{}表示,元素间用,分割
—建立集合类型用{}或set()
—建立空集合类型,必须使用set()

在这里插入图片描述
在这里插入图片描述

2>集合操作符
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3>集合处理方法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4>集合类型应用场景
–包含关系比较
在这里插入图片描述
–数据去重

在这里插入图片描述

2.序列类型及操作

1>序列类型定义:基类类型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2>序列处理函数及方法
在这里插入图片描述
在这里插入图片描述

3>元组类型及操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4>列表类型及操作
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5>序列类型应用场景
在这里插入图片描述
在这里插入图片描述

3.实例:基本统计值计算

在这里插入图片描述

#CalStatisticsV1.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=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]+number[size//2])/2
    else:
        med=numbers[size//2]
    return med
n=getNum()
m=mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m,dev(n,m),median(n)))

4.字典类型及操作

1>字典类型定义
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2>字典处理函数及方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3>字典类型应用场景
在这里插入图片描述

5.jieba库的使用

1>jieba库基本介绍
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2>jieba使用说明
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.实例:文本词频统计

在这里插入图片描述

1>哈姆雷特

#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()
#得到的words是一个列表,空格分隔,具体看字符串的.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=Ture)
#对列表按照键值对的第二个元素进行排序,排序方式是由大到小
for i in range(10):
    word,count=items[i]
    print("{0:<10}{1:>5".format(word,count))

2>三国演义
在这里插入图片描述

#CalThreeKingdomsV1.py
import jieba
txt=open("threekingdoms.txt","r",encoding="utf-8").read()
words=jieba.lcut(txt)
counts={
    
    }
for word in words:
    if len(word)==1:
        coutinue
    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))

3>升级版三国演义

#CalThreeKingdomsV2.py
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]=count.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))
    
#还得继续优化,把不是人名或者人名重复的加入excludes中

7.练习题,累辽

1>实例9:基本统计值计算
描述
这是"实例"题,与课上讲解实例相同,请作答检验学习效果.获取以逗号分隔的多个数据输入(输入为一行),计算基本统计值(平均值、标准差、中位数)
除中位数外,其他输出保留小数点后两位。
请补充编程模板中代码完成

#请在...补充一行或多行代码
#CalStatisticsV1.py
def getNum():  # 获取用户不定长度的输入
    t = input()
    t = t.split(',')
    t = list(t)
    j = 0
    for i in t:
        t[j] = eval(i)
        j+=1
    return t
def mean(numbers):  # 计算平均值
    t = 0
    k = len(numbers)
    for i in numbers:
        t+=i
    return t/k
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):  # 计算中位数
    l = len(numbers)
    numbers.sort()
    if(l%2==0):
        return (numbers[l//2]+numbers[l//2-1])/2
    else:
        return numbers[l//2]
n = getNum()  # 主体函数
m = mean(n)
print("平均值:{:.2f},标准差:{:.2f},中位数:{}".format(m,dev(n,m),median(n)))

(1) 获取多个数据:从控制台获取逗号分隔的多个数据
(2) 多函数编写方法:模块化设计方法,每部分功能比较清晰
(3) 排序:列表ls的默认排序方法是ls.sort(),如果从大到小排序,用ls.sort(reverse=True)

2>实例10:文本词频统计 – Hamlet
描述
这是"实例"题,与课上讲解实例相同,请作答检验学习效果/文本词频统计::一篇文章,出现了哪些词?哪些词出现的最多?
英文文本:hamlet.txt,参考附件
请统计hamlet.txt文件中出现的英文单词情况,统计并输出出现最多的10个单词,注意:
(1) 单词不区分大小写,即单词的大小写或组合形式一样;
(2) 请在文本中剔除如下特殊符号:!"#$%&()*+,-./:;<=>?@[\]^_‘{|}~
(3) 输出10个单词,每个单词一行;
(4) 输出单词为小写形式。

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 (word)  #输出出现最多的10个单词

3>人名独特性统计
描述
编程模板中给出了一个字符串,其中包含了含有重复的人名,请去重后给出独特性人名的统计。
输出模板中字符串共有多少个独特人名。

s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 
       杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙 
       金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍 
       鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰 
       阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰 
       乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王 
       忽必烈 慕容复 张三丰 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正 
       李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复 
       逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣 
       洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复 
       黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄 
       张三丰 令狐冲 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫 
       洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈 
       完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱 
       郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲 
       谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉 
       双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏 
       逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄'''
s = s.split()
s = set(s)
print(len(s))

4>字典翻转输出
描述
读入一个字典类型的字符串,反转其中键值对输出。
即,读入字典key:value模式,输出value:key模式。
输入格式
用户输入的字典格式的字符串,如果输入不正确,提示:输入错误。
输出格式
给定字典d,按照print(d)方式输出

s = input()
try:
    d = eval(s)
    e = {
    
    }
    for k in d:
        e[d[k]] = k
    print(e)
except:
    print("输入错误")
 

5>《沉默的羔羊》之最多单词
描述
附件是《沉默的羔羊》中文版内容,请读入内容,分词后输出长度大于2且最多的单词。
如果存在多个单词出现频率一致,请输出按照Unicode排序后最大的单词。
输入格式
文件
输出格式
字符串

import  jieba
txt = open("沉默的羔羊.txt", "r",encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {
    
    }
for word in words:
    if len(word)==1 or len(word)==2:
        continue
    else:
        counts[word] = counts.get(word,0)+1
items = list(counts.items())
items.sort(key = lambda  x:x[1],reverse=True)
word,count = items[0]
print("{}".format(word))

6>数字不同数之和

描述
获得用户输入的一个整数N,输出N中所出现不同数字的和。
例如:用户输入 123123123,其中所出现的不同数字为:1、2、3,这几个数字和为6。

n = input()
ss = set(n)
s = 0
for i in ss:
    s += eval(i)
print(s)

##字符串可以通过list()直接变成列表,或通过set()直接变成集合。
7>人名最多数统计
描述
编程模板中给出了一个字符串,其中包含了含有重复的人名,请直接输出出现最多的人名。

s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 
       杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙 
       金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍 
       鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰 
       阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰 
       乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王 
       忽必烈 慕容复 张三丰 赵敏 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正 
       李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复 
       逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣 
       洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复 
       黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄 
       张三丰 令狐冲 赵敏 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫 
       洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈 
       完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱 
       郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲 
       谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉 
       双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏 
       逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄 赵敏'''
names = s.split()
d = {
    
    }
for name in names:
    d[name] = d.get(name, 0) + 1
Maxkey = ""
MaxValue = 0
for k in d:
    if d[k] > MaxValue:
        Maxkey = k
        MaxValue = d[k]
print(Maxkey)

8.总结。。。(我为什么在写废话

废话预警,又开始了莫名好累,害,冲,马上就整完了!!!

Guess you like

Origin blog.csdn.net/weixin_45800653/article/details/107787906