组合数据类型2

6.4字典类型及操作

6.4.1字典类型定义

  1. 映射:映射是一种键(索引)和值(数据)的对应
  2. 字典类型是数据组织与表达的一种新形态
  3. 字典类型是映射的体现
    ——键值对:键是数据索引的扩展
    ——字典是键值对的集合,键值对之间无序
    ——采用大括号{}和dict()创建,键值对用冒号:表示
    例如:{<键1>:<值1>,..., <键n>:<值n>}
  4. 在字典变量中,通过键获得值
    <字典变量> = {<键1>:<值1>,…,<键n>:<值n>}
    ——<值> = <字典变量>[<键>]
    —— <字典变量>[<键>] = <值>,[ ]用来向字典变量中索引或增加元素
d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
d["中国"]   #返回 '北京'
d["韩国"] = '首尔' #右边的字符一定要加引号,否则会报错,将"韩国":"首尔"添加到字典类型中,若键在字典中已存在,则修改其值
de = {}; type(de)  #生成一个空的字典, type(x) 返回变量x的类型 ,检测x的类型。 <class 'dict'>

  1. 集合类型和字典类型都用{}表示,集合类型空的时候不能用{}表示,因为{}默认给了空的字典类型。

6.4.2字典处理函数及方法

函数或方法描述
del d[k]删除字典d中键k对应的数据值
k in d判断k是否在字典d中,如果在返回True,否则返回False
d.keys()返回字典d中所有的键信息
d.values()返回字典d中所有的值信息
d.items()返回字典d中所有的键值对信息
d.get(k, < default >)键k存在,则返回相应值,不在则返回< default >值
d.pop(k, < default >)键k存在,则取出相应值,取出后删除对应键值对,不在则返回< default >值
d.popitem()随机从字典中取出一个键值对,以元组形式返回
d.clear()删除所有的键值对
len(d)返回字典d中元素的个数
  1. d.keys()和d.values()并不返回列表类型,返回字典的key类型,values类型,可以用for in遍历,但不能用作列表类型。
  2. 常用基本操作:
    ——定义空字典d:d = { }
    ——向d新增2个键值对元素:d[“1”] = ‘a’ 执行后 ,d[“2”] = ‘b’
    ——修改第二个元素:d[“2”] = ‘ddd’
    ——判断字符c是否是d的键:‘c’ in d
    ——计算d的长度:len(d)
    ——清空d: d.clear()

6.4.2字典类型应用场景

  1. 映射的表达
    ——映射无处不在,键值对无处不在
    ——例如:统计数据出现的次数,数据是键,次数是值
    ——最主要作用:表达键值对数据,进而操作它们
  2. 元素遍历
for k in d:
	<语句块>

6.5jieba库的使用

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

  2. 安装jieba库的命令 pip install jieba (cmd命令行下)

  3. jieba库通过中文词库的方式识别分词,
    ——利用词库计算汉字间构成词语的关联概率
    ——汉字间概率大的组成分词,形成分词结果
    ——除了分词,用后可以添加自定义的词组

  4. jieba库的使用
    精确模式、全模式、搜索引擎模式
    ——精确模式:把文本精确切分开,不存在冗余单词
    ——全模式:把文本中所有可能的词语都扫描出来,有冗余
    ——搜索引擎模式:在精确模式的基础上,对长词再次切分

  5. 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实例:文本词频统计

——需求:一篇文章,出现了哪些词?哪些词出现得最多
——该如何做呢?
英文文本——>中文文本
—英文文本:Hamet 分析词频(文本内容链接如下)
https://python123.io/resources/pye/hamlet.txt
—中文文本:《三国演义》 分析人物(文本内容链接如下)
https://python123.io/resources/pye/threekingdoms.txt

英文文本:单词之间有空格,也有多种标点符号,
第1步骤:将文本进行噪音处理、归一化,提取其中的每个单词

#复制代码后出错可能是因为格式问题,注意调格式
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) #对一个列表按照键值对的2个元素第2个元素进行排序,由大到小倒排
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() #打开三国演义文本
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)#对一个列表按照键值对的2个元素第2个元素进行排序,由大到小倒排
for i in range(15):
	word, count = items[i]
	print("{0:10}{1:5}".format(word, count))#上述代码结果因分词问题存在着问题

sort方法和sorted方法

方法描述及实例
sort(key, reverse)默认情况下,sort()不需要任何其他参数。但是,它有两个可选参数:reverse -如果为true,则排序后的列表将反转(或以降序排序)key -用作排序比较键的函数
sorted(list, key= , reverse= )与sort作用类似,但返回结果不同

sort()和sorted()之间最简单的区别是:sort()不返回任何值,而sorted()返回可迭代的列表。

将词频与人物相关联,面向问题
词频统计——>人物统计

#修改的代码中应将确定不是人名的词,给出排除词库
#CalThreeKingdomsV2.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))

在上述代码基础上,仍可以继续进行修改,进一步统计人物出场次数。

文本词频统计举一反三:
——《红楼梦》、《西游记》、《水浒传》…
——政府工作报告、科研论文、新闻报道…
——进一步呢?未来还有词云…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值