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)

判断是否一个键在字典中

 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 中剩的姓名
 将新生成的合并数据写入新文件
 关闭文件

你可能感兴趣的:(6.Python之字典的基础)