字典是针对非系列集合而提供的一种数据类型
举例: 检测学生信息
“<键><值> 对”
键(即身份证号)
值(即学生信息)
“键值对” 例子
姓名和电话号码
用户和密码
国家名称和首都等
字典的概念
映射:通过任意键值查找集合中信息的过程
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)
判断是否一个键在字典中
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 == d2
True
d1!=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 = []
# 单词数组-作为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 中剩的姓名
将新生成的合并数据写入新文件
关闭文件
网友评论