2021-08-01 Python嵩天MOOC学习笔记 第六周

Python嵩天MOOC学习笔记

第六周:组合数据类型

一、集合类型及操作

集合类型的定义
多个元素的无序组合,集合中不可有相同元素,元素是不可变数据类型。
格式:

  • 集合用大括号{}表示,元素之间用逗号分隔
  • 建立集合类型用{}或set()(空集合必用)
A = {"python",123,("python",123)} 
#使用{}建立集合,大括号内的小括号为元组
B = set("pypy123")
#等同于B = {'1','p','2','3','y'},顺序随意,集合元素无顺序
C = {"python",123,123}
#等同于C = {"python",123}

集合间的运算

操作符描述
S|T集合的并
S-TS中减掉T的元素
S&T集合的交
S^T包括S和T中的非相同元素
< <= > >=返回True和False,反映子集关系
可以用增强操作符

集合处理方法’.'
在这里插入图片描述
在这里插入图片描述

S.clear移除S中所有元素
S.pop随机返回S的一个元素,并且在S中删掉这个元素,若S为空取不出元素则产生KeyError异常

**因为集合是没有顺序的,所以用for in遍历的时候顺序不一定是定义的顺序

A = {"P","Y",123}
try:
	while True: #无限循环设计
		print(A.pop(),end = "")
except:
	pass
#result: P123Y
>>A
set()

集合类型应用场景
包含关系比较
数据去重↓

>>>ls = ["p","p","y","y",123] #这是一个列表
>>>s = set(ls)
>>>lt = list(s) #再转为列表类型
>['p','y',123]

二、序列类型及操作

序列类型的定义
序列是具有先后关系的一组元素,元素可以相同,可以通过下标索引。包括:字符串类型,元组类型,列表类型。
索引关系有正向递增和反向递减。
序列处理函数以及方法

操作符和函数描述
x in s
x not in s
s +t连接s和t
sn或者ns将序列s复制n次
s[i]索引
s[i:j(:k)]切片
len() min() max()用min和max需要元素可以比较,比如字符串中元素按Unicode顺序比较
s.index(x) 或 s.index(x,i,j)返回序列s从i开始到j位置中第一次出现元素x的位置
s.count(x)返回序列s中出现x的总次数

元组类型

  • 定义:一旦创建就不能被修改
  • 创建方式:()或者tuple(),元素间用逗号分隔,也可以不用()
def func():
	return 1,2
#此处返回1,2看成是返回一个值,返回一个元组类型的值
>>>creature = "cat","dog","tiger"
>>>creature
>('cat','dog','tiger')
>>>color = ("blue",creature)
>>>color
>("blue",('cat','dog','tiger'))
>>>color[-1][2]
  • 元组继承了序列类型的全部通用操作

列表类型的特点

  • 元素创建后可以修改
  • [] 或者 list()来创建,元素间用逗号分隔
  • 各元素类型可以不同,无长度限制
  • △如果我们在程序中使用了[]或者list则真正创建了一个列表,如果只是(ls=[],lt=ls)赋值则没有创建,只是相当于用指针连接

列表类型的操作函数和方法
在这里插入图片描述

>>>ls = [1,2,3,4,5,6,7]
>>>del ls[::3]
>[2,3,5,6]
>记住步长是怎么计算的,从第一个到最后一个,取第一个,再取第1+3个,以此类推

>>>ls*2
>[1,2,3,4,5,6,7,1,2,3,4,5,6,7]
#会改变ls的值

在这里插入图片描述
ls.insert(i,x):x加进去后序号是i

序列类型的应用场景
元组
用于元素不改变的应用场景

当不希望数据被程序改变时,可以转换成元组类型
>>>ls = ['cat','dog','tiger',1024]
>>>lt = tuple(ls)
>>>lt
('cat','dog','tiger',1024)

列表

三、实例:基本统计值

对一组数分析求和,平均值,中位数等
输入:获取用户不定长度的输入
总个数:for in
平均值:…
中位数:排序,再…

#CalStatisticV1.py
def getnum():
	nums=[]
	inumstr=input("请输入数字(回车退出)")
	while inumstr != "":
		nums.append(eval(inumstr))
		inumstr=input("请输入数字(回车退出)")
	return nums
求中位数:如何排序
def median(numbers):
	num_new = sorted(numbers)
	size = len(num_new)
	if size%2 == 0:
		med=...
	else:
		med=...
	return med

四、字典类型(映射类型)及操作

定义:
映射:键(索引)和值(数据)
数据组织表达的新形态
键值对之间无序
采用大括号{}和dict()创建,键值对用冒号:表示

创建:
<字典变量>={<>:<>,<>:<>,...,<>:<>}
获得值:
<> = <字典变量>[<>]
<字典变量>[<>] = <>
[]用来向字典变量中索引或增加元素

创建空字典:
>>>de = {};type(de)
> <class'dict'>
# type(x) 即返回变量x的类型

字典处理函数及方法:基本同上
在这里插入图片描述
d.keys()和d.values()返回的是字典的key和字典的values类型,可以做遍历但是不是列表类型。

de = {"fruit":"apple","animal":"pig","color":"blue"}
items = list(de.items())
>>> items
[('fruit', 'apple'), ('animal', 'pig'), ('color', 'blue')]

在这里插入图片描述

五、jieba库

作用:
分词
分词模式:

  • 精确模式:把文本精确地切分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余(词语间所有的分词可能性都切分出来)
  • 搜索引擎模式:在精确模式基础上对长词再次切分(适合对短词的搜索)

jieba库常用函数:返回列表类型
在这里插入图片描述
先进行精确模式,发现长词:中华人民共和国所以对其再次分词

函数描述
jieba.add_word(w)向分词词典增加新词w,如>>>jieba.add_word(“蟒蛇语言”)

六、文本词频统计

英文文本:Hemlet
噪音处理:去掉大小写区别和标点符号

中文文本
噪音处理:jieba分词可以去掉标点符号,且中文没有大小写问题,所以只需要jieba就可以了。

扩展应用
书籍;政府工作报告、科研论文、新闻报道;词云

七、习题

①sorted语法:
语法
sorted(iterable, cmp=None, key=None, reverse=False)

参数说明:
iterable – 可迭代对象。
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回值
返回重新排序的列表,不修改原列表的值。

②sort语法
不同点:
改变原列表的值

以Hamlet词频统计代码语句为例:
items.sort(key=lambda x:x[1],reverse=True)
#按第二个元素排序,从大到小逆序排,结果保存在items中

注意sort和sorted只能用于列表形式,所以在应用之前都要把其他形式改成list

③字典翻转输出

try:
    dstr = input()
    d = eval(dstr) #如何把以字典形式输入的字符串化成字典
    d_new = {}
    for key in d.keys():
        d_new[d[key]] = key
    print (d_new)
except:
    print("输入错误") #如何在输入不正确是输出提示信息

④沉默的羔羊词频统计:增加了“同频词汇Unicode排序”功能

import jieba
def samerate(items): #输出有多少个同频词汇
    for i in range(len(items)):
        if items[i][1]>items[i+1][1]:
            return i+1
        elif i==(len(items)-2):
            return i+2
        
txt = open("沉默的羔羊.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)
maxword = items[0][0]
for j in range(samerate(items)): #遍历同频词汇,找出Unicode码最大的一个词
    if ord(maxword[0]) < ord(items[j][0][0]): #注意ord()参数只能是一个字符!一个!!
        maxword = items[j][0]
print(maxword)

⑤错题
知识点:创建字典时,如果相同键对应不同值,字典采用最后(最新)一个"键值对"。

d = {"a":1,"b":2,"b":3}
print(d["b"])
>>3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值