第六周
6.1 集合类型及操作
1.集合类型的定义
集合是多个元素的无序组合,每个元素唯一,不存在相同元素。集合元素不可更改,不能是可变数据类型。这是因为,若集合元素可以改变,那么万一改变成和其它元素重复的,必然造成错误。
集合用大括号{}表示,元素之间用逗号分隔。建立集合类型有{}或set()。如果建立空集合,必须用set()。例如:
A={“python”,123,(“python”,123)}#使用{}建立集合
结果是:{‘python’,123,(‘python’,123)}
B=set(“pypy123”)#使用set()建立集合
结果是{‘1’,’p’,’2’,’3’,’y’}
2.集合操作符
集合间操作主要有:
(1)并:S|T
(2)差:S-T
(3)交:S&T
(4)补:S^T
表1.1 6个操作符
操作符及应用 | 描述 |
S|T | 返回一个新集合,包括在集合S和T中所有元素 |
S-T | 返回一个新集合,包括在集合S但不T中的元素 |
S&T | 返回一个新集合,包括同时在集合S和T中的元素 |
S^T | 返回一个新集合,包括集合S和T中的费相同元素 |
S<=T或S<T | 返回True或False,判断S和T的子集关系 |
S>=T或S>T | 返回True或False,判断S和T的包含关系 |
表1.2 4个增强操作符
操作符及应用 | 描述 |
S|=T | 更新集合S,包括在集合S和T中所有元素 |
S-=T | 更新集合S,包括在集合S但不T中的元素 |
S&=T | 更新集合S,包括同时在集合S和T中的元素 |
S^=T | 更新集合S,包括集合S和T中的费相同元素 |
3.集合处理方法
表1.3 集合处理方法
操作函数及方法 | 描述 |
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异常 |
S.copy() | 返回S的一个副本 |
len(S) | 返回集合S中元素个数 |
x in S | 判断S中元素是否有x,若有返回True,否则False |
x not in S | 判断S中元素是否无x,若无返回True,否则False |
set(x) | 将其他类型变量x转变成集合类型 |
6.2 序列类型及操作
1.序列类型的定义
序列是具有先后关系的一组元素。它是一维元素向量,元素类型可以不同;类似数学元素序列s0,s1,…,sn-1。元素间由序号引导,通过下标访问序列的特定元素。
序列是一个基类类型。序列衍生出:字符串类型、元组类型、列表类型。
2.序列处理函数及方法
基本之前都讲过,这里只讲下面几个:
s.index(x)或s.index(x,i,j):返回s从i开始到j位置(省略i和j则是整个序列)中第一次出现x的位置。
s.count(x):是中出现x的总次数。
3.元组类型及操作
元组是一种序列类型,但是它一旦被创建就不能修改。元组使用小括号()或者tuple()创建,元素之间用逗号分隔。在使用的时候,可以使用或不使用小括号。
4.列表类型及操作
元组是一种序列类型,但是它创建后能修改。它使用方括号[]或list()创建,元素用逗号分隔。可以使用或不使用小括号。
表2.1 列表类型操作函数和方法
函数或方法 | 描述 |
ls[i]=x | 替换列表ls第i个元素为x |
ls[i:j:k]=lt | 用列表lt替换ls切片后所对应元素字列表 |
del ls[i] | 删除列表ls中的第i元素 |
del ls[i:j:k] | 很容易懂,不写了 |
ls+=lt | 更新列表ls,将lt加到ls后面 |
ls*=n | 更新列表ls,其元素重复n次 |
ls.append(x) | 在ls后面增加一个元素x |
ls.insert(i,x) | 在ls第i个位置增加元素x |
ls.remove(x) | 将ls中出现的第一个x删除 |
ls.reverse() | 将ls反转 |
5.序列类型典型应用场景
元组用于元素不改变的应用场景,更多用于固定搭配场景;列表更加灵活,它最常用的序列类型。
6.3 实例9:基本统计值计算
例:计算一组数据的总个数、总和、平均数、方差、中位数。
代码:
def getNum(): nums = [] iNumStr = input("请输入数字") while iNumStr !="": nums.append(eval(iNumStr)) iNumStr = input("请输入数字") return numsdef getMean(numbers): s=0.0 for num in numbers: 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=getMean(n)d=dev(n,m)med = median(n)print("平均值是{0},方差是{1},中位数是{2}".format(m,d,med))
6.4 字典类型及操作
1.字典类型定义
字典类型是映射的体现,它通过键值对来体现,键是数据索引的扩展,字典是键值对的集合,键值对之间无序。采用大括号{}和dict()创建,键值对用冒号表示。例如:
d={“China”:”Beijing”,”France”:”Paris”}
输入
d[“China”]
结果是
’Beijing’
如果我们想生成一个空字典,则可以是使用
de={}
直接用大括号只能生成字典!
2.字典处理函数及方法
表4.1 字典类型操作函数和方法
函数或方法 | 描述 |
del d[k] | 删除字典d中键k对应的数据值 |
k in d | 判断键k是否在字典d中,在就是True,否则False。k是索引 |
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中元素的个数 |
6.5 模块5:jieba库的使用
jieba是优秀的中文分词第三方库。jieba分词有三种模式:精确模式、全模式、搜索引擎模式。
精确模式:把文本精确的分开,不存在冗余单词。
全模式:把文本中所有可能的词语都扫描出来,有冗余。
搜索引擎模式:在精确模式基础上,对长词再次切分。
表5.1 jieba库常用函数
函数 | 描述 |
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果。 |
jieba.lcut(s.cut_all=True) | 全模式,返回一个列表类型的粉刺结果,存在冗余。 |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余。 |
jieba.add_word(w) | 向分词词典增加新词w |
6.6 实例10:文本词频统计
1.Hamlet词频统计:
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) + 1items = 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))
2. 《三国演义》人物出场统计(下)(含《三国演义》原文文本)
import jiebaexcludes = {"将军","却说","荆州","二人","不可","不能","如此"}txt = open("threekingdoms.txt", "r", encoding='utf-8').read()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) + 1for 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))