6.4字典类型及操作
6.4.1字典类型定义
- 映射:映射是一种键(索引)和值(数据)的对应
- 字典类型是数据组织与表达的一种新形态
- 字典类型是映射的体现
——键值对:键是数据索引的扩展
——字典是键值对的集合,键值对之间无序
——采用大括号{}和dict()创建,键值对用冒号:表示
例如:{<键1>:<值1>,..., <键n>:<值n>}
- 在字典变量中,通过键获得值
<字典变量> = {<键1>:<值1>,…,<键n>:<值n>}
——<值> = <字典变量>[<键>]
—— <字典变量>[<键>] = <值>,[ ]用来向字典变量中索引或增加元素
d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
d["中国"] #返回 '北京'
d["韩国"] = '首尔' #右边的字符一定要加引号,否则会报错,将"韩国":"首尔"添加到字典类型中,若键在字典中已存在,则修改其值
de = {}; type(de) #生成一个空的字典, type(x) 返回变量x的类型 ,检测x的类型。 <class 'dict'>
- 集合类型和字典类型都用{}表示,集合类型空的时候不能用{}表示,因为{}默认给了空的字典类型。
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中元素的个数 |
- d.keys()和d.values()并不返回列表类型,返回字典的key类型,values类型,可以用for in遍历,但不能用作列表类型。
- 常用基本操作:
——定义空字典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字典类型应用场景
- 映射的表达
——映射无处不在,键值对无处不在
——例如:统计数据出现的次数,数据是键,次数是值
——最主要作用:表达键值对数据,进而操作它们 - 元素遍历
for k in d:
<语句块>
6.5jieba库的使用
-
jieba是优秀的中文分词第三方库
——中文文本需要通过分词获得单个的词语
——jieba是优秀的中文分词第三方库,需要额外安装
——jieba库提供三种分词模式,最简单只需掌握一个函数 -
安装jieba库的命令
pip install jieba
(cmd命令行下) -
jieba库通过中文词库的方式识别分词,
——利用词库计算汉字间构成词语的关联概率
——汉字间概率大的组成分词,形成分词结果
——除了分词,用后可以添加自定义的词组 -
jieba库的使用
精确模式、全模式、搜索引擎模式
——精确模式:把文本精确切分开,不存在冗余单词
——全模式:把文本中所有可能的词语都扫描出来,有冗余
——搜索引擎模式:在精确模式的基础上,对长词再次切分 -
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))
在上述代码基础上,仍可以继续进行修改,进一步统计人物出场次数。
文本词频统计举一反三:
——《红楼梦》、《西游记》、《水浒传》…
——政府工作报告、科研论文、新闻报道…
——进一步呢?未来还有词云…