集合 类型及操作
定义:多个元素的无序组合
---集合元素之间无序,每个元素唯一,不存在相同元素
---集合元素不可更改,不能是可变数据类型
---应用场景:关系比较;数据去重,集合类型所有元素无重复
集合处理方法
操作函数或方法 | 描述 |
---|---|
S.add(x) | 如果x不在集合s中,将x增加到s |
S.discard(x) | 移除s中元素x,如果x不在集合s中,不报错 |
S.remove(x) | 移除s中元素x,如果x不在集合s中,产生keyError 异常 |
S.clear() | 移除s中所有元素 |
S.pop() | 随机返回s的一个元素,更新s,若s为空产生KeyError 异常 |
#数据去重 ld = ["p", "p", "y", "y", 123] s = set(ld) >>>{'p', 'y', 123} lt = list(s) ['p', 'y', 123]
序列类型
定义:是具有先后关系的一组元素(基类类型 ):字符串,元组和列表
--序列是一维元素向量,元素类型可以不同
--元素间由序号引导,通过下标访问序列的特定元素
通用函数及方法
函数和方法 | 描述 |
---|---|
len(s) | 返回序列x的长度 |
min(s) | 返回序列s的最小元素,s中元素需要可比较 |
max(s) | 返回序列s的最大元素,s中元素需要可比较 |
s.index(x) && s.index(x) | 返回序列s从i开始到j位置中第一次出现元素x的位置(索引) |
s.count(x) | 返回序列s中出现x的总次数 |
元组类型
定义:是序列类型的一种扩展,一旦创建就不能被修改
--使用小括号()或tuple()创建,元素间用逗号分隔
--继承了序列类型的全部通用操作
列表类型
定义:是序列类型的一种扩展,十分常用,创建后可以被随意修改
--使用[]或list()创建,元素间用逗号分隔
--列表中各元素不同,无长度限制
函数及方法 | 描述 |
---|---|
ls[i] = x | 替换列表ls第i元素为x |
ls[i:j:k] = lt | 用列表lt替换ls切片后所对应的子元素列表 |
del ls[i] | 删除列表ls中第i元素 |
del ls[i:j:k] | 删除列表ls中第i到第j以k为步长的元素 |
ls += lt | 更新列表ls,将列表lt元素增加到列表ls中 |
ls* = n | 更新列表ls,使其元素重复n次 |
函数及方法 | 描述 |
---|---|
ls.append(X) | 在列表ls最后增加一个元素x |
ls.clear() | 删除列表ls中所有元素 |
ls.copy() | 生成一个新列表,赋值ls中所有元素 |
ls.insert(i, x) | 在列表ls的第i位置增加元素x |
ls.pop(i) | 将列表ls中第i位置元素取出并删除该元素 |
ls.remove(x) | 将列表ls中出现的第一个元素x删除 |
ls.reverse() | 将列表ls中的元素反转 |
序列类型及应用场景
元素遍历:
#列表类型: for item in ls: <语句块> #元组类型: for item in tp: <语句块>
数据保护
定义:如果不希望数据被程序所改变,可转换为元组类型
ls = ["cat", "dog", "tiger", 1024] lt = tuple(ls)
基本统计运算
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:排序 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()
创建,键值对用 :表示
函数及方法 | 描述 |
---|---|
del d[k] | 删除字典d中对应的数据值 |
k in d | 判断k是否在字典d中,返回(true和false) |
d.keys() | 返回字典d中所有的键信息 |
d.values() | 返回字典d中所有的值信息 |
d.items() | 返回字典d中所有的键值对的信息 |
函数及方法 | 描述 |
---|---|
d.get(k, default) | 键k存在,返回相应的值,不存在啧返回default值 |
d.pop(k, default) | 键k存在,取出相应的值,不存在啧返回default值 |
d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
d.clear() | 删除所有的键值对 |
len(d) | 返回字典d中元素的个数 |
#定义空字典 >>> d={} #向d新增2个键值对元素 >>> d["d"]=1;b["b"]=2 #修改第二个元素 >>> d["b"]=3
jieba
库
--中文文本需要通过分词获得单个的词语
--
jieba
是优秀的中文分词第三方库,需要额外安装,依靠中文词库,除了分词,用户可以添加自定义词组--
jieba
库提供三种分词模式,最简单只需要掌握一个函数
精确模式
把文本精确的切分开,不存在冗余单词
全模式
把文本中所有可能词语都扫描出来,有冗余
搜索引擎模式
在精确模式基础上,对长词再次切分,存在冗余
jieba
库常用函数
函数 | 描述 |
---|---|
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
jieba.lcut(s, cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 |
jieba.add_word(w) | 向分词词典增加新词w |
文本词频统计
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 = Ture) for i in range(10): word, count = items[i] print("{0:<10}{1:>5}".format(word, count)) #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 continue 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)) #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 = "孔明" else: rword = word counts[word] = counts.get(word, 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))