【6】Python组合数据类型

集合类型及操作

集合类型定义

多个元素的无序组合

  • 与数学中的集合概念一致
  • 集合元素之间无序,每个元素唯一,不存在相同元素
  • 集合元素不可更改,不可变数据类型

集合是多个元素的无序组合

  • {}表示,元素间用逗号分隔
  • 建立集合类型用{}set()
  • 建立空集合类型,必须使用set()

集合操作符

符号 描述
S │ T 并运算
S - T 差运算
S & T 交运算
S ^ T 补运算
S <= TS < T 返回True/False,判断S和T的子集关系
S >= TS > T 返回True/False,判断S和T的包含关系

四个增强操作符

符号 描述
S │= T 更新集合S,包括在集合S和T中的所有元素
S - = T 更新集合S,包括在集合S但不在T中的所有元素
S &= T 更新集合S,包括同时在集合S和T中的所有元素
S ^= T 更新集合S,包括在集合S和T中的非相同元素

集合处理方法

操作函数或方法 描述
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,x在集合S中返回True,否则返回False
x not in S 判断S中元素x,x不在集合S中返回True,否则返回False
set(x) 将其他类型的变量x转换为集合类型

从A中不断取出元素进行打印

for item in A:
    print(item, end='')
try:
    while True:
        print(A.pop(), end='')
except:
    pass

集合类型应用场景

包含关系的比较

使用保留字in,>=,>,<=,<

数据去重

>>> ls = ['p', 'p', 'y', 'y', 123]
>>> s = set(ls)
{'p', 'y', 123}
>>> lt = list(s)
['p', 'y', 123]

序列类型及操作

序列类型定义

具有先后关系的一组元素

  • 一维元素向量,元素类型可以不同
  • 类似数学元素序列
  • 元素间由序号引导,通过下标访问序列的特定元素

序列是一个基类类型,可衍生为字符串、元祖和列表类型
序号:正向递增,反向递减

序列处理函数及方法

6个操作符

操作符及使用 描述
x in s 判断s中元素x,x在序列s中返回True,否则返回False
x not in s 判断s中元素x,x在序列s中返回False,否则返回True
s + t 连接两个序列s和t
s * nn * s 将序列s复制n次
s[i] 索引,返回s中的第i个元素,i是序列的序号
s[i:j]s[i:j:k] 切片,返回序列s中第i到第j以k为步长的元素子序列

5个函数及方法

函数及方法 描述
len(s) 返回序列s的长度
min(s) 返回序列s中的最小元素
max(s) 返回序列s中的最大元素
s.index(x)s.index(x, i, j) 返回序列s从i开始到j位置中第一次出现元素x的位置
s.count(x) 返回序列s中出现x的总次数

元组类型及操作

元组是序列类型的一种扩展

  • 元组是一种序列类型,一旦创建就不能被修改
  • 使用小括号()tuple()创建,元素间用逗号分隔,分隔
  • 可以使用或不使用小括号
>>> creature = `cat`, `dog`, `tiger`, `human`
>>> creature
(`cat`, `dog`, `tiger`, `human`)

元组继承序列类型的全部通用操作

  • 元组继承了序列类型的全部通用操作
  • 创建后不可修改,因此没有特殊操作
  • 使用或不使用小括号

列表类型及操作

列表是序列类型的一种扩展,十分常用

  • 列表是一种序列类型,创建后可以随意被修改
  • 使用方括号[]list()创建,元素间用逗号,分隔
  • 列表中各元素类型可以不同,无长度限制
ls = ['cat', 'dog', 'tiger', 1024]
>>> ls
['cat', 'dog', 'tiger', 1024]
>>> lt = ls   #方括号[]真正创建一个列表,赋值仅传递引用,并没有再生成一个列表
>>> lt
['cat', 'dog', 'tiger', 1024]

列表类型操作函数和方法

函数或方法 描述
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删除

序列类型应用场景

  • 元组用于元素不改变的应用场景,更多用于固定搭配场景
  • 列表更加灵活,最常用的序列类型
  • 最主要作用:表示一组有序数据,进而操作它们

元素遍历

for item in ls:
    <语句块>

数据保护

  • 如果不希望数据被程序所改变,转换成元组类型
>>> ls = ['cat', 'dog', 'tiger', 1024]
>>> lt = tuple(ls)
>>> lt
('cat', 'dog', 'tiger', 1024)

实例9:基本统计值计算

基本统计值

  • 需求:给出一组数,对它们有个该要理解
    总数、求和、平均值、方差、中位数...
  • 总个数:len()
  • 求和:for ... in
  • 平均值:求和/总个数
  • 方差:各数据与平均数差的平方和的平均数
  • 中位数

实例讲解

#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('平均值:{},方差:{},中位数:{}.'.format(m, dev(n,m), median(n)))

举一反三

技术能力扩展

  • 获取多个数据:从控制台获取多个不确定数据的方法
  • 分隔多个函数:模块化设计方法
  • 充分利用函数:充分利用Python提供的内容函数

字典类型及操作

字典类型定义

理解“映射”

  • 映射是一种键(索引)和值(数据)的对应
    字典类型是“映射”的体现
  • 键值对:键是数据索引的扩展
  • 字典是键值对的集合,键值对之间无序
  • 采用大括号{}dict()创建,键值对用冒号:表示
    <键1>:<值1>, <键2>:<值2>, ..., <键n>:<值n>}

字典类型的用法

在字典变量中,通过键获得值
<字典变量>={<键1>:<值1>, <键2>:<值2>, ..., <键n>:<值n>}
<值>=<字典变量>[<键>]
<字典变量>[<键>]=<值>
[]用来向字典变量中索引或增加元素

字典处理函数及方法

函数或方法 描述
del d[k] 删除字典d中对应的数据值
k in d 判断键k是否在字典d中,如果在返回True,否则False
d.keys() 返回字典d中所有的键信息
d.values() 返回字典d中所有的值信息
d.iems() 返回字典d中所有的键值对信息
d.get(k,<default>) 键k存在,返回相应值,不存在则返回<default>值
d.pop(k,<default>) 键k存在,取出相应值,不存在则返回<default>值
d.popitem() 随机从字典d中取出一个键值对,以元组形式返回
d.clear() 删除所有的键值对
len(d) 返回字典d中元素的个数

字典类型的应用场景

映射的表达

  • 映射无处不在,键值对无处不在
    例如:统计数据出现的次数,数据是键,次数是值
  • 最主要作用:表达键值对数据,进而操作它们

元素遍历

for k in d:
    <语句块>

模块5:jieba库的使用

jieba库基本介绍

jieba是优秀的中文分词第三方库

  • 中文文本需要通过分词获得单个的词语
  • jieba是优秀的中文分词第三方库,需要额外安装
  • jieba库提供三种分词模式,最简单只需要掌握一个函数

jieba库的安装

cmd命令行:

pip install jieba

jieba分词的原理

jieba分词依靠中文词库

  • 利用一个中文词库,确定汉字之间的关联概率
  • 汉字间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义的词组

jieba库使用说明

三个模式

  • 精确模式:把文本精确的切分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
  • 搜索引擎模式:在精确模式基础上,对长词再次切分
函数 描述
jieba.lcut(s) 精确模式,返回一个列表类型的分词结果
jieba.lcut(s, cut_all=True) 全模式,返回一个列表类型的分词结果,存在冗余
jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型的分词结果,存在冗余
jieba.add_word(w) 向分词词典增加新词w
>>> jieba.lcut('中国是一个伟大的国家')
['中国', '是', '一个', '伟大', '的', '国家']
>>> jieba.lcut('中国是一个伟大的国家', cut_all=True)
['中国', '国是', '一个', '伟大', '的', '国家']
>>> jieba.lcut_for_search('中华人民共和国是伟大的')
['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']

实例10:文本词频统计

  • 需求:一篇文章,出现了哪些单词?出现的次数?
    英文文本?中文文本?

英文文本:Hamlet分析词频
中文文本:《三国演义》分析人物

“Hamlet英文词频统计”实例讲解

#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    #返回键word对应的值
item = list(counts.item())
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))

输出结果

the        1138
and         965
to          754
of          669
you         550
i           542
a           542
my          514
hamlet      462
in          436

《三国演义》人物出厂统计

#CalThreeKingdomsV1.py
import jieba
txt = open('threekingkoms.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))

输出结果

曹操          953
孔明          836
将军          772
却说          656
玄德          585
关公          510
丞相          491
二人          469
不可          440
荆州          425
玄德曰         390
孔明曰         390
不能          384
如此          378
张飞          358

将词频与人物相关联,面向问题
词频统计→人物统计
给出排除词库

#CalThreeKingdomsV1.py
import jieba
txt = open('threekingkoms.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.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))

输出结果里可能还含有其他词语,加入excludes里不断优化

举一反三

应用问题的扩展

  • 《红楼梦》、《西游记》、《水浒站》...
  • 政府工作报告、科研论文、新闻报道...
  • 进一步,词云
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • A、组合数据类型概述 计算机不仅对单个变量表示的数据进行处理,更多情况,计算机需要对一组数据进行批量处理。例: 给...
    井上皓阅读 5,186评论 0 3
  • 基于《Python语言程序设计基础(第2版)》 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 ...
    柄志阅读 27,355评论 4 44
  • 集合类型 集合是多个元素的无序组合集合类型与数学中的集合概念一致集合元素之间无序,每个元素唯一,不存在相同元素 集...
    丿小七阅读 513评论 0 0
  • 最近几年看了很多与《红楼梦》相关的文章,也一遍遍的阅读过原著,回想第一次阅读时自己还不足10岁,对于书中那些晦涩难...
    lu青lu阅读 289评论 5 3
  • 犯错不可怕,可怕的是不告诉承担犯错后该承担的责任,人要不但的去探索,敢于犯错敢于承担。领导者最重要的品质就...
    孙倩阅读 199评论 0 0