python之字典类型

本文介绍Python字典的基础操作,包括词频统计与地址簿合并两个实际案例。词频统计案例展示了如何读取文本文件,计算并绘制定量词汇的出现频率;地址簿合并案例则演示了如何使用字典来整合不同来源的联系人信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典基础


字典操作


通过中括号可以增加字典的一项

访问字典中的值,如果不存在则会报错

删除命令

遍历字典

字典操作符

注意:字典不支持拼接操作符和重复操作符

从下图可以看出字典是无序的



字典的方法




字典示例1——统计词频



步骤:

1.输入英文文章

2.建立用于词频计算的空字典

3.对文本的每一行进行计算词频

4.从字典中获取数据对到列表中

5.对列表中的数据对交换位置,并从大到小进行排序

6.输出结果

7.利用Turtle库绘制图表


#coding=gbk
import turtle

##全局变量##
#词频排列显示个数
count = 10
#单词频率数组-作为y轴数据
data = []
#单词数组-作为x轴数据
words = []
#y轴显示放大倍数-可以根据词频数量进行调节
yScale = 6
#x轴显示放大倍数-可以根据count数量进行调节
xScale = 30


#################Turtle start#####################
#从点(x1,y1)到(x2,y2)绘制线段
#在下面两个函数中,t是用于绘制的Turtle对象
def drawLine(t,x1,y1,x2,y2):
    t.penup()
    t.goto(x1,y1)
    t.pendown()
    t.goto(x2,y2)

def drawText(t,x,y,text):
    t.penup()
    t.goto(x,y)
    t.pendown()
    t.write(text)

#绘制一个柱体
def drawRectangle(t,x,y):
    x=x*xScale
    y=y*yScale#放大倍数显示
    drawLine(t,x-5,0,x-5,y)
    drawLine(t,x-5,0,x+5,y)
    drawLine(t,x+5,0,x+5,y)
    drawLine(t,x+5,0,x-5,y)

#绘制多个柱体
def drawBar(t):
    for i in range(count):
        drawRectangle(t, i+1, data[i])

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]))
        drawText(t, x*xScale-4, data[x-1]*yScale+10,data[x-1])
    drawBar(t)
    
#空格替换标点的函数
def replacePunctuation(line):
    for ch in line:
        if ch in "~@#$%^&()_-+=<>?/,.:;{}[]|\'""":
            line = line.replace(ch,"")
    return line


#统计一行文本的词频
def processLine(line,wordCounts):
    #用空格替换标点符号
    line=replacePunctuation(line)
    #从每一行获取没歌词
    words=line.split()
    for word in words:
        if word in wordCounts:
            wordCounts[word] += 1
        else:
            wordCounts[word] = 1

def main():
    #strip()方法删除开头结尾的空格
    filename = input("enter a filename:").strip()
    infile = open(filename,"r")
    
    #建立用于计算词频的空字典
    wordCounts = {}
    #一个遍历文件内容的框架
    for line in infile:
        processLine(line.lower(), wordCounts)
    
    #下面是统计词频
    
    #获取字典数据对
    pairs = list(wordCounts.items())
    
    #列表中的数据对交换位置,数据对排序
    items = [[x,y]for (y,x) in pairs]
    items.sort()
    
    #输出count个数词频结果
    for i in range(len(items)-1,len(items)-count-1,-1):
        print(items[i][1]+"\t"+str(items[i][0]))
        data.append(items[i][0])
        words.append(items[i][1])
    
    turtle.title('词频结果柱状图')
    turtle.setup(900,750,0,0)
    t = turtle.Turtle()
    t.hideturtle()
    t.width(3)
    drawGraph(t)
    
main()
turtle.done()
    


运行结果如下:




字典示例2——利用字典完成AddressBook的合并



#coding=gbk

def main():
    
    ftele2=open("TeleAddressBook.txt","rb")
    ftele1=open("EmailAddressBook.txt","rb")
    
    ftele1.readline()
    ftele2.readline()
    lines1=ftele1.readlines()
    lines2=ftele2.readlines()
    
    dic1 = {}
    dic2 = {}
    
    for line in lines1:#获取第一个文本中的姓名和电话信息
        elements=line.split()
        #将文本读出来的bytes转换为str类型
        dic1[elements[0]] = str(elements[1].decode('gbk'))
        
    for line in lines2:#获取第二个文本中的姓名和电话信息
        elements=line.split()
        #将文本读出来的bytes转换为str类型
        dic2[elements[0]] = str(elements[1].decode('gbk'))
        
    ###开始处理###
    lines = []
    lines.append('姓名\t    电话   \t  邮箱\n')

    for key in dic1:
        s= ''
        if key in dic2.keys():
                s = '\t'.join([str(key.decode('gbk')), dic1[key], dic2[key]])
                s += '\n'
        else:
                s = '\t'.join([str(key.decode('gbk')), dic1[key], str('   -----   ')])
                s += '\n'
        lines.append(s)
         
    for key in dic2:
        s= ''
        if key not in dic1.keys():
                s = '\t'.join([str(key.decode('gbk')), str('   -----   '), dic2[key]])
                s += '\n'       
        lines.append(s)

    ftele3 = open('AddressBook.txt', 'w')
    ftele3.writelines(lines)

    ftele3.close()
    ftele1.close()
    ftele2.close()
    print("The addressBooks are merged!")

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值