本篇介绍python中集合、序列、字典相关数据类型;
1、集合类型及操作:
集合类型的定义:集合是多个元素的无序组合,集合和数学中集合类型概念一致;集合之间元素无序,每个元素唯一,不存在相同元素,集合元素不可更改,不能是可变数据类型;
集合是多个元素的数据组合,使用{}大括号表示,元素间用逗号分隔,建立集合类型使用{}或者set(),建立空集合类型使用set()集合定义
集合操作符:
python提供了集合有6中操作符,除了并、交、差、补外还提供了集合间关系操作符<=,>=,集合操作符
同时python语法提供了集合的增强操作符:集合的增强操作符
集合处理方法:
python有多种集合操作符,具体如下:集合操作函数1集合操作函数2
集合类型应用场景:
集合可以判断字符是否存在于集合中,可以用于数据去重场景,集合类型所有数据无重复;
2、序列类型及操作(元组和列表):
序列定义:序列是具有先后顺序的一组数;
序列是一维元素向量,元素类型可以不同,类似与数学元素序列,元素间由序号引导,通过下标访问序列的特定元素;
序列是一个基类类型,包括字符串类型、元组类型、列表类型,都遵循正向递增,反向递减规则;
序列处理函数和方法:
序列类型通用操作符包括如下:序列操作符
序列类型通用函数和方法:序列函数和方法
元组类型及操作:
元组是序列的一种扩展,元组是一种序列类型一旦创建就不能修改,使用小括号()或者tuple()创建,元素间使用逗号分隔,可以使用或者不使用小括号;
元组类型继承了序列类型的全部通用类型的操作,元组一旦创建不能修改因此没有特殊操作,元组可以使用小括号也可以不使用小括号;
列表类型及操作:
列表是序列类型的一种扩展,十分常用,列表是一种序列类型创建后可以随意修改,使用[]或者list()创建,元素间使用逗号分割,列表中各元素类型可以不同,没有长度限制;
列表类型操作函数和方法:列表操作函数和方法列表操作函数和方法
序列类型应用场景:
元组用于不改变的应用场景,更多用于固定搭配场景;
列表更加灵活,是常用的序列类型;
序列类型主要作用是表示一组有序数据,进而操作它们;
主要用于元素遍历、数据保护;
3、实例:基本统计值和计算;
需求:给出一组数据,对这一组数据需要有一个概要理解;(总个数、求和、平均值、方差)
#calstatisticsv1.py
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(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)))
4、字典类型及操作;
字典类型定义:字典是一种键(索引)和值(数据)的对应;字典的映射类型是由用户为数据定义的索引;
字典是键值对的集合,键值对间是无序的;采用大括号{}和dict()创建,键值对使用冒号:表示;
在字典中通过键获取值;
字典处理函数和方法:
字典基本函数处理方法:字典函数字典函数1
字典类型应用场景:
映射无处不在,统计数据出现的次数,数据是键值是次数;请求返回的json
或者请求的json参数都是一种意义上的字典;
5、jieba库的使用:
中文文本需要通过分词获得单个的词语;jieba是优秀的python中文分词第三方库,需要额外安装,jieba提供三种分词模式,最简单的需要掌握一个函数;
安装:在cmd中使用pip install jieba 自动下载安装;
jieba分词依靠中文字符之间的关联概率,中文间概率大的组成词组,形成分词结果,除了分词用户还可以添加自定义词组;
jieba分为三种使用模式:精确模式、全模式、搜索引擎模式;
精确模式:是把文本精确的切分开,不存在多余的单词;
全模式:把文本中所有可能的词语扫描出来,有多余的单词;
搜索引擎模式:在精确基础之上再对长词进行切分;
jieba库常用函数:jieba库基本函数jieba库基本函数
6、文本词频统计问题分析:
需求:对一篇文本中出现了哪些词,哪些词出现的频率最高?或者一本小说中人物出场次数......
#哈姆雷特英文中词频统计;
#calhamletv1.py
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 = True)
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()
excludes = {"将军","却说","荆州","二人","不可","不能","如此","商议","如何","主公","军士","左右"
,"军马","引兵","次日","大喜","天下","东吴","于是",
"今日","不敢","魏兵","陛下","人马","一人","都督",
"不知","汉中"}
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(10):
word,count = items[i]
print("{0:<10}{1:>5}".format(word,count))