#1组合数据类型:组合数据类型为多个同类型或不同类型数据提供单一表示,使数据操作更有序,更容易。组合数据类型分为三类:序列类型,集合类型和映射类型。
##1.1集合类型
###1.1.1 集合是多个元素的无序类型。集合类型与数学中集合的概念一致;集合元素之间无序,每个元素唯一,不存在相同元素;集合元素不可更改,不能是可变数据类型。
集合用”{}“表示,元素之间用逗号分隔;建立集合类型用”{}“或set();
建立空集合类型必须使用set()。
###1.1.2 集合类型的操作符
集合类型有4种基本操作:交集(&),并集(|),差集(-),补集(^),操作逻辑与数学定义相同。
基本操作符:
增强操作符
集合类型的操作函数或方法:
##1.2序列类型
序列类型是一维元素向量,元素之间可以相同,元素类型可以不同,元素之间存在先后关系,通过序号访问,类似于数学元素序列:S0,S1…S(n-1)。元素间由序号引导,通过下标访问序列的特定元素。
序列类型的索引体系:
序列类型的通用操作符和函数:
###1.2.1字符串类型
字符串类型就是序列类型的一种扩展,只不过每个元素在字符串中只是一个字符,而在序列类型中,其中每一个元素可以是·任何一种数据类型。
###1.2.2元组类型
使用小括号或tuple()创建,元素间用逗号隔开。元组类型就是将元素进行有序的排列,用”()“形式组织。元组继承了序列类型的全部通用操作;元组因为创建后不能修改,因此没有特殊操作;使用或不使用括号。
creature = "cat", "dog", "tiger","human"
print(creature)
creature = "cat", "dog", "tiger","human"
color = (0x001100,"blue","red",creature)
print(color)
对比两种代码运行结果,显而易见得出元组的特点。
###1.2.3列表类型
列表类型是一种序列类型,创建后可以随意被修改;使用[]或list()创建,元素之间用逗号隔开;列表中各元素类型可以不同,无长度限制。
ls = ["cat", "dog", "tiger","human"]
lt = ls
print(lt)
方括号真正创建一个列表,赋值仅传递作用,并没有再次创建。
ls = ["cat", "dog", "tiger","human","1024"]
ls[1:2] = [1, 2, 3, 4] #将最初ls列表中1到2位中间增加[1,2,3,4]
print(ls)
ls = ["cat", "dog", "tiger","human","1024"]
ls[1:2] = [1, 2, 3, 4]
del ls[::3] #删除列表中以3为步长的子序列
print(ls)
ls = ["cat", "dog", "tiger","human","1024"]
ls[1:2] = [1, 2, 3, 4]
del ls[::3]
lt = ls * 2 #对列表进行元素复制
print(lt)
ls = ["cat", "dog", "tiger","human","1024"]
ls.append(11234) #在列表最后增加元素"11234"
print(ls)
ls = ["cat", "dog", "tiger","human","1024"]
ls.insert(3, "red") #在列表第三位增加元素“red”
print(ls)
ls = ["cat", "dog", "tiger","human","1024"]
ls.reverse() #将列表ls元素进行反转
print(ls)
列表功能:
#2实例:基本统计值计算
基本统计值:
总个数:len()
求和:for…in
平均值:求和/总个数
方差:各数据与平均数差的平方的和的平均数
中位数:排序
from math import sqrt
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
for num in numbers:
sdev = sdev + (num - mean)**2
return s.rt(sdev / (len(numbers)-1))
def median(numbers): #计算中位数
sorted(numbers)
new = sorted(numbers)
size = len(numbers)
if size % 2 ==0:
med = (new[size//2-1] + new[size//2])/2
else:
med = new[size//2]
return med
n = getNum() #主体函数
m = mean(n)
print("平均值:{},标准差:{:.2},中位数:{}.".format(m,dev(n,m),median(n)))
#3字典类型
##3.1映射类型
映射类型是”键(索引)-值(数据)“数据项的组合,每一个元素是一个键值对,即元素是(key-value),元素之间是无序的。键值对是一种二元关系,源于属性和值的映射关系。
序列类型由0,1,2…N整数作为数据的默认索引。映射类型是将默认的索引,改为用户自定义的索引,映射类型是由用户为数据定义索引的一种映射类型。
键(key)表示一个属性,也可理解为一个类别或项目,值(value)是属性的内容,键值对刻画了一个属性和它的值。键值对将映射关系结构化,用于存储和表达。映射类型主要以字典体现。字典类型是数据组织与表达的一种新的形态。
##3.2字典类型
键值对:键是是对数据索引的扩展。
字典是键值对的集合,键值对之间无序。采用大括号和dict()创建,键值对用冒号表示。
<字典变量> = {<键1>:<值1>,<键2>:<值2>,…,<键n>:<值n>}
<值> = <字典变量>[<键>]
[]用来向字典变量中索引或增加元素。
##3.3字典处理函数及方法
d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print("中国" in d) #判断索引”中国“是否在字典中
d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print(d.keys()) #调用字典中的所有键
d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print(d.values()) #调用字典中的所有值
d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print(d.get("中国","伊斯兰堡")) #以中国为键获取字典d中的值
d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print(d.get("巴基斯坦","伊斯兰堡"))
d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print(d.popitem()) #从字典中随机获取一个键值对
字典功能
字典也可以通过for-in语句对其元素进行遍历
for <变量名> in <字典名>:
<语句块>
映射无处不在,键值对无处不在。例:统计数据出现的次数,数据是键,次数是值。
#4jieba库的使用
jieba库的分词原理是利用一个中文库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组。除了分词,jieba还提供增加自定义中文单词的功能。
jieba库的三种分词模式:
精确模式:把句子最精确地切开,适合文本分析,不存在冗余单词;
全模式;把句子中所有可以成词的词语都扫描出来,速度快但不能消除歧义,有冗余;
搜索引擎模式:在精确的基础上,对长词再次切片,提高召回率,适合用于搜索引擎分词,有冗余。
常用函数:
#5实例:Hamlet英文词频统计
def getText():
txt = open("hamlet.txt", "r").read() #读取文件
txt = txt.lower() #将所有英文字母变为小写
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_`~':
txt = txt.replace(ch," ") #将文章中所有标点符号转化为空格
return txt
hamleTxt = getText()
words = hamleTxt.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=True) #排序
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
#6实例《三国演义》人物出场统计
import jieba #调用jieba库
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) #进行排序
for i in range(15): #输出前15
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
import jieba
excludes = {"将军","却说","荆州","二人","不可","不能","如此"}
txt = open("三国演义.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) + 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(15):
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
本章学习首先是对组合数据类型进行深入了解,组合数据类型分为序列类型,集合类型和映射类型。最为重要的是序列类型和映射类型,其中序列类型又分为字符串,元组和列表,这里面需要重点学习的是列表和元组,映射类型里面需要重点学习的是字典。学习组合数据类型先要分清所属关系,然后重点理解和应用。这些类型中包括很多函数功能和方法需要我们深入的理解。实例“基本统计值计算”和实例“文本词频统计”需要我们看懂代码,了解函数应用的方法。