6.Python之字典的基础

字典是针对非系列集合而提供的一种数据类型

? 举例: 检测学生信息 ? “<键><值> 对” ? 键(即身份证号) ? 值(即学生信息)? “键值对” 例子 ? 姓名和电话号码 ?用户和密码 ? 国家名称和首都等

字典的概念
? 映射:通过任意键值查找集合中信息的过程 ? python中通过字典实现映射 ? 字典是键值对的集合 ?该集合以键为索引 ? 同一个键信息对应一个值

简单的字典的实例
passwd = {"China","BigCountry","Korean",:"SmallCountry","France":"MediumCountry"} print(passwd){'Korean': 'SmallCountry', 'France': 'MediumCountry', 'China': 'BigCountry'}

字典类型与系列类型的区别
? 存取和访问方式不同 ? 键的类型不同 ? 序列类型只能用数字类型的键 ? 字典类型可以用其他对象类型作键 ?排列方式不同 ? 系列类型保持了元素的相对关系 ? 而字典中的数据是无序排列的 ? 映射方式不同 ? 系列类型通过地址映射到值 ? 字典类型通过键直接映射到值

字典的操作 为字典增加一项
? dictionaryName[key] = value ? 举例:students = {"203-2012-045":"John","203-2012-037":"Peter"} students["202-2011-121"] = "Susan" #增加一个新的数据项

访问字典中的值
? dictionaryName[key]返回键key对应的值value? 举例:students["202-2011-121"] = "Susen" #增加一个新的数据项 students["202-2011-121"]

删除字典中的项
? del divtionaryName[key]? 举例:del students["202-2011-121"]

字典的遍历
? for key in students: print(key + ":" +str(students[key]))? 举例: students = {"203-2012-045":"John","203-2012-037":"Peter"} for key in students: print(key + ":" +str(students[key]))? 遍历字典的键key for key in dictionaryName.key():print(key) ? 遍历字典的值value for value in dictionaryName.values():print(value) ? 遍历字典的项 for item in dictionaryNames():print(item) ? 遍历字典的key-value for item,value in adict.items():print(item,value)

【6.Python之字典的基础】判断是否一个键在字典中
? in 或者 not in ? 举例students = {"203-2012-045":"John","203-2012-037":"Peter"} "203-2012-045" in students True "203-2014-045" in students False

字典的标准操作符
? -,<,>,<=,>=,==,!=,and,or,not ? 字典相等测试d1 = {"red": 41,"blue":3} d2 = {"blue":3,"red": 41}d1 == d2Trued1!=d2 False

Python还提供了丰富的字典方法,其中:
方法 解释
keys():tuple 返回一个含有字典所有key的列表
values():tuple 返回一个包含字典多有value的列表
Items():tuple 返回一个包含所有键值的列表
clear():None 返回字典中key对应的值
get(key):val 删除并返回字典中key对应的值
updata(字典) 将字典中的键值添加到字典中
方法示例:
students = {"203-2012-045":"John","203-1012-037":"Peter"} tuple(students.keys())('203-1012-037', '203-2012-045')tuple(students.values())('Peter', 'John')tuple(students.items())(('203-1012-037', 'Peter'), ('203-2012-045', 'John'))students.get("203-2012-045")'Peter'students {'203-2012-045': 'John'}students.clear() students{}

字典实例一 统计词频
? “统计词频” 问题 ? 统计文章其中多次出现的词语 ? 概要分析文章内容 ? 搜索引擎

统计词频IPO描述
? 输入:从文件中读取一篇英文文章 ? 处理: 统计文件中每个单词出现频率 ? 输出: 输出最常出现10个单词及次数图像

实现
? 第一步:输入英文文章 ? 第二步: 建立用于词频计算的空字典 ? 第三步: 对文本的每一行计算词频 ? 第四步:从字典中获取数据对交换位置,并从大到小排序 ? 第五步:输出结果 ? 最后用turtle库绘制统计词频结果图表

符号替换repleacePunctuations(lines()
def repleacePunctuations(line): for ch in line: if ch in "~@#%^()_-+=<>?/,.:; {}[]|\""": line = line.replace(ch, "") return line

统计词频主程序
? 输入英文文本名称filename = input("Enter a filename:").strip() nfile = open(filename, "r")? 建立一个空字典 wordCounts = {}? 对每一行进行统计 for line in infile: processLine(line.lower(), wordCounts)? 词频排序 pairs = list(wordCounts.items())? 交换列表数据项排序items = [[x,y] for(x,y) in paris] item.sort()? 绘制柱状图 ? 初始化窗口,画笔 ? 调用drawGraph()进行绘制turtle.titile("词频统计结果柱状图") turtle.setup(900,750,0,0) t = turtle.Turtle() t.hideturtle() t.width(3) drawGraph(t)? 定义全局变量# 词频排序显示个数 count =10 # 单词频率数组-作为y轴数据 data = https://www.it610.com/article/[] # 单词数组-作为x轴的数据 words = [] # y轴显示放大倍数-可以根据词频数量进行调节 yScale = 6 #x轴显示放大倍数-可以根据count数量进行调节 xScale = 30? drawLine()绘制线段 ? drawText()绘制文字#从点(x1,y1)到(x2,y2)绘制线段 def drawLine(t, x1, y1, x2, y2): t.penup() t.goto(x1,y1) t.pendown() t.goto(x2,y2)#在坐标(x, y)处写入文字 def drawText(t,x, y, text): t.penup() t.goto(x, y) t.pendown()t.write(text)? drawRectangel()绘制矩形 ? drawBar()绘制多个柱体# 绘制一个柱体 def drawRectangle(t,x ,y): x = x*xScale y = y*yScale #放大倍数显示 drawLine(t, x-5, 0, x-5, y) drawLine(t,x-5, y, x+5, y) drawLine(t, x+5, y,x+5, 0) drawLine(t,x+5, y, x+5, 0) drawLine(t,x+5,0,x-5,0)#绘制多个柱体 def drawBar(t): for i in range(count): drawRectangle(t, i+1, data[i])? drawGrsph()绘制统计图def drawGraph(t): #绘制x/y轴线 drawLine(t, 0, 0, 360,0) drawLine(t,0,300, 0, 0)#x轴:坐标及描述 for x in range(count): x = x+1# 向右移一位,为了不画在原点上 drawText (t, x*xScale- 4, -20, (words[x-1])) drawTest(t,x*xScale-4, data[x-1]*yScale[x-1]*yScale+10, data[x-1]) drawBar(t)

字典实例二
? 同前,有电话簿TeleAddressBook和邮箱地址簿EmailAddessBook两个文件,使用字典结构将其合并为一个完整的AddressBook文件? 打开文件并读取文件 ? 将文件的多行数据存储至lines1,lines2变量中ftele1.readline() #跳过第一行 ftele2.readline() lines1 = ftele1.readlines() lines2 = ftele2.readlines()? 建立空字典dic1,dic2存储姓名,电话和邮箱: dic1 = {} dic2 = {}? 获取TeleAdressBook中的信息: for line in lines1:#获取第二个文本中的姓名和电话信息 elements = line.split() dic1[elements[0]] = str(elements[1].decode('gbk')) ? 获取EmailAddressBook中的信息: for line in line2: elements = line.split() dic2[elements[0]] = str(elements[1].decode('gbk'))

文本合并处理
? 生成新的数据表头 ? 按字典键的操作遍历姓名列表1 ? 处理与表2重名的信息 ? 处理其他信息 ? 处理列表2 中剩余的姓名? 按字典键的操作遍历姓名for key in dic1: s = '' if key in dic2.keys(): s = '\t'.join([str(key.decode('gbk')), dic1[key], dic2[key]]) else: s = '\t'.join([str(key.decode('gbk')), dic1[key], str('----') s += '\n' lines.append(s)? 处理列表2 中剩的姓名 ? 将新生成的合并数据写入新文件 ? 关闭文件

    推荐阅读