【第六周】组合数据类型:集合、序列(字符串、元组、列表)、字典——北理工Python慕课笔记

三种集合数据类型:集合、序列(字符串、元组、列表)、字典

第六周 组合数据类型

集合类型及操作

  • 定义:唯一、无序、用{}表示
    创建字典时,如果相同键对应不同值,字典采用最后(最新)一个"键值对"
    在这里插入图片描述
    因为元素唯一所以不可变,列表可改变
    在这里插入图片描述
    在这里插入图片描述
    注意set是把每一个字母当一个元素拆开,{}是按逗号分开元素

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

  • 增加操作符:用=同时更新S
    在这里插入图片描述
    例子:
    在这里插入图片描述

  • 集合的处理方法
    用‘.’调用方法
    在这里插入图片描述
    产生异常可以用try…except捕捉
    在这里插入图片描述
    例子:
    在这里插入图片描述
    注意集合是无序的,也就是在存储中的顺序和代码写的顺序不相同,程序员无法获知,也就是无序的
    除了for in 以外,while的遍历方法:
    在这里插入图片描述
    这是从前面的A集合不断取出元素,当取完就会产生异常,try语句捕捉异常进而跳出while死循环
    for in语句为主

  • 集合类型应用场景
    关系比较
    在这里插入图片描述
    数据去重:利用集合唯一性
    将列表变成集合再变回去
    在这里插入图片描述

序列类型及操作(字符串、元组、列表)

  • 定义:具有先后关系,元素类型可以不同,是一个基类型,它的所有操作,字符串,元组,列表都可以用
    在这里插入图片描述
    在这里插入图片描述
  • 序列处理函数及方法
    在这里插入图片描述
    在这里插入图片描述
    原PPT写错啦哈哈,s[::-1]是相反取出
    在这里插入图片描述
    index函数也就是在部分或整体范围内查找x元素并返回其下标/索引
    s.index(x)返回第一次出现x的序号,并不返回全部序号。
    例子:
    在这里插入图片描述

元组类型及操作

  • 定义:不可修改、用=()或不加()或tuple()创建
    在这里插入图片描述
    return 的其实就是一个元组类型
    在这里插入图片描述

    例子:
    在这里插入图片描述
    注意[::-1]并不改变原来元组值而是生成一个新的元组值

列表类型及操作

  • 定义:== 可修改,[]或list()创建==

在这里插入图片描述
例子:在这里插入图片描述
lt类似取别名,并没有再系统中再生成新列表
只有用[]或list()才是真正创建了一个列表,如果用=等价于取别名

  • 操作函数
    在这里插入图片描述
    例子:将从1-2号元素替换为xx序列、删除以3为步长的元素(036)、翻倍
    在这里插入图片描述
    列表类型的方法:
    在这里插入图片描述
    例子:
    在这里插入图片描述
    注意insert是在第几号元素之后添加(毕竟第0号就只能在之后添加嘛)

总结:
添加:一个append inset 多个+=[1,2,3]
删除:一个pop remove 多个del ls[i:j:k]

序列应用场景

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

实例9:基本统计值计算

基本统计值:总个数,求和,平均值,方差,中位数等

#获取用户输入,返回一个列表(不确定多个)
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("平均值:{},方差:{:.2},中位数:{}.".format(m,dev(n,m),median(n)))

字典类型及操作

  • 定义:是自定义索引的键值对,键值对之间无序,用{}或dict()创建,键值时间用:表示
    在这里插入图片描述
    在这里插入图片描述
    例子:通过中国这个索引查找并返回北京这个值
    在这里插入图片描述
    类似a[0]不过是0是自定义
    用{}默认生成一个空字典,与集合不同的是{}里面的键值对,所以空集合不能用{}来生成,用set()来生成空集合
    在这里插入图片描述
  • 字典类型的操作函数和方法
    在这里插入图片描述
    例子:
    在这里插入图片描述
    注意返回的是字典的key/value类型,不是列表类型,可以用for…in做遍历
    在这里插入图片描述
    例子:
    在这里插入图片描述
    注意:popitem是随机抽一个键值对,同时有从字典里面删除掉,返回的是元组类型
    例子:新增用=
    在这里插入图片描述
  • 字典的应用场景
    在这里插入图片描述

模块5:jieba库

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

  • jieba库的使用
    在这里插入图片描述
    在这里插入图片描述
    搜索引擎模式是在精确模式的基础上增加长词的分词
    在这里插入图片描述

实例10:文本词频统计

需求:分许一篇文章出现的词,出现最多的词,包括中英文
英文哈姆雷特
https://python123.io/resources/pye/hamlet.txt
中文三国演义
https://python123.io/resources/pye/threekingdoms.txt

下面是哈姆雷特词频统计。

#计算文章里面的词频
#对文件的去噪处理
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#遍历每一个单词,如如果字典中已经存在就把它对应的值+1,否则返回0再+1
items=list(counts.items())#把字典变成列表类型
items.sort(key=lambda x:x[1],reverse=True)#指定排序列(按键值对的值排序),设定返回的排序从大到小
for i in range(10):
    word,count=items[i]#将词频排序前10的键值对打印出来
    print("{0:<10}{1:>5}".format(word,count))

下面是三国演义出场人物统计

#用jieba库统计三国演义出场人物
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(10):
    word,count=items[i]#将词频排序前10的键值对打印出来
    print("{0:<10}{1:>5}".format(word,count))

由于发现运行结果要剔除很久,所以就懒得再增加啦

注意:
若使用cmd安装jieba库却用pycharm进行编译运行,需要更改解释器为源python安装路径的那个(由于本人从pycharm里面安装一直不成功所以用这种方法)
详见关于pip安装第三方库,但PyCharm中却无法识别的问题;以及PyCharm安装第三方库的方法解析.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值