Jupyter笔记-Python语法基础(U.6)

为mooc网站的北京理工大学的 嵩天 、黄天羽 、礼欣 三位老师的课程笔记。

6 组合数据类型

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

6.1 集合类型及操作

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

6.1.1 集合定义

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

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,<default>) 键k存在,则返回相应值,不在则返回<default>值
d.pop(k,<default>) 键k存在,则取出相应值,不在则返回<default>值
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) 向分词词典增加新词w jieba.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

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

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