Python语法基础(U.6)-组合数据类型

为mooc网站的北京理工大学的 嵩天 、黄天羽 、礼欣 三位老师的课程笔记。
欢迎starGITHUB可下载源码

6 组合数据类型

6.1 集合类型及操作
6.2 序列类型及操作(元组类型、列表类型)
6.3 实例9:基本统计值计算
6.4 字典类型及操作
6.5 模块5:jieba库的使用
6.6 实例10:文本词频统计

6.1 集合类型及操作

集合类型定义;
集合操作符;
集合处理方法;
集合类型应用场景;

6.1.1 集合定义

集合是不可变数据类型,每个元素唯一,不存在相同元素,元素之间无顺序,用大括号{}表示,元素间用逗号分隔,建立集合用{}或set(),建立空集合时必须使用set()

A = {"python", 123, ("python", 123)}:{123,‘python’,(‘python’,123)}; #使用{}建立集合
B = set("pypy123"):{‘1’,‘p’,‘2’,‘3’,‘y’}; #使用set()建立集合

6.1.2 集合操作符

并,差,交,补

操作符及应用描述
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的包含关系
4个增强操作符及应用描述
S |= T更新集合S,包括在集合S和T中的所有元素
S -= T更新集合S,包括在集合S但不在T中的元素
S &= T更新集合S,包括同时在集合S和T中的元素
S ^= T更新集合S,包括集合S和T中的非相同元素

6.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(x)返回集合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转变为集合类型

6.1.4 集合类型应用场景

  • 包含关系比较;
  • 数据去重:集合类型所有元素无重复;
    ls = ["p", "p", "y", "y", 123] s = set(ls) #利用了集合无重复元素的特点 lt = list(s) #将集合转换为列表

6.2 序列类型及操作

序列类型定义;序列类型处理函数及方法;元组类型及操作;列表类型及操作;序列类型应用场景;

6.2.1 定义

  1. 序列是具有先后关系的一组元素:是一维元素向量,元素类型可不同;类似数学元素;元素间由序号引导,通过小标访问序列的特定元素;
  2. 序列是一个基类类型:里面有字符串类型,元组类型,列表类型;
  3. 反向递减,正向递增;

6.2.2 处理函数及方法

操作符及应用描述
x in S如果x是序列S的元素,返回True,否则返回False
x not in S如果x不是S中,返回True,否则返回False
s + t连接两个序列s和t
sn 或 ns将序列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的最小元素,s中元素需要可比较
max(s)返回序列s的最大元素,s中元素需要可比较
s.index(x)或s.index(x,i,j)返回序列s从i开始到j位置中第一次出现元素x的位置

6.2.3 元组类型及操作

  • 元组是序列类型的一种扩展:一旦创建就不能被修改;使用小括号()或tuple()创建,元素间用逗号分隔;可使用小括号或不使用小括号;
  • 元组继承序列类型的全部通用操作:没有特殊操作;

6.2.4 列表类型及操作

  • 列表是序列类型,创建后可随意修改;使用[]或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中出现的第一个元素删除
ls.reverse()将列表ls中的元素反转

6.2.5 应用场景

  • 数据表示:元组用于元素不改变的应用场景,更多用于固定搭配场景;列表更加灵活,最常用的序列类型;表示一组有序数据;
  • 元素遍历:for item in ls:;for item in tp:;
  • 数据保护:不希望数据被程序所改变,转换成元组类型(tuple());
# 6.1.3.py
A = {"python", 123, ("python", 123)}
try:
    while True:
        print(A.pop(),end="")
except:
    pass

123python('python', 123)

6.3 基本数据统计值计算

需求:给出一组数,对它们有个概要理解;

  • 总个数:len()
  • 求和:for ... in
  • 平均值:求和/总个数
  • 方差:各数据与平均数差的平方的和的平均数
  • 中位数:排序,求中间值
# 6.3CalStatisticsV1.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)))
请输入数字(回车退出):1
请输入数字(回车退出):2
请输入数字(回车退出):3
请输入数字(回车退出):4
请输入数字(回车退出):5
请输入数字(回车退出):
平均值:3.0,方差:1.6,中位数:3

6.4 字典类型及操作

字典类型定义,字典处理函数及方法,字典类型应用场景

6.4.1 定义

  • 字典类型是“映射”的体现:键值对,键是数据索引的扩展;字典是键值对的集合,键值对之间无序;采用大括号{}dict()创建,键值对用冒号:表示;type(x):返回变量x的类型;

6.4.2 处理函数及方法

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

6.4.3 应用场景

映射的表达;表达键值对数据,进而操作它们;

6.5 jieba库介绍

6.5.1 概述

中文分词第三方库;

6.5.2 jieba分词的三种模式

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

6.6 实例10:文本词频统计

6.6.1 问题分析

在英文中文中,出现哪些词,出现多少次?

6.6.2 hamlet英文词频统计

  • CalHamletV1.py

6.6.3 三国演义人物出场统计

  • CalThreeKingdomsV1.py
  • CalThreeKingdomsV2.py
# CalHamletV1.py
def getText():     #获取文本,归一化处理文本
    txt = open("E:\python\learn\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)    #对一个列表按照键值对的2个元素的第2个元素进行排序,排序方式为由大到小的倒排
for i in range(10):    #将前10位字数打印输出
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word,count))
the         137
to           99
he           71
and          65
hamlet       57
of           52
his          52
was          49
that         36
king         31
#CalThreeKingdomsV1.py   三国演义人物出场文本统计
import jieba
txt = open("E:/python/learn/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))
曹操          934
孔明          831
将军          761
却说          647
玄德          569
关公          509
丞相          488
二人          465
不可          435
荆州          420
孔明曰         385
玄德曰         383
不能          383
如此          376
张飞          348
#CalThreeKingdomsV2.py   三国演义人物出场文本统计
import jieba
txt = open("E:/python/learn/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(15):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))
曹操         1429
孔明         1373
刘备         1223
关羽          779
张飞          348
商议          344
如何          336
主公          327
军士          310
吕布          300
左右          291
军马          288
次日          270
引兵          269
大喜          265

点赞,关注,收藏👍,➕,👀点赞,关注,收藏👍,➕,👀点赞,关注,收藏👍,➕,👀
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘
💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值