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 中剩的姓名
? 将新生成的合并数据写入新文件
? 关闭文件
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息