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-T | S中减掉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