python-字典
1、字典概念
字典是针对非序列集合而提供的一种数据类型
举例:检索学生信息。
“<键><值>对” 。
键(即身份证号码)值(即学生信息)。
“键值对” 例子:姓名和电话号码、用户名和密码
映射: 通过任意键值查找集合中值信息的过程
python中通过字典实现映射
字典是键值对的集合 :该集合以键为索引,同一个键信息对应一个值
2、字典类型与序列类型的区别
(1)存取和访问方式不同
(2) 键的类型不同
序列类型只能用数字类型的键
字典类型可以用其他对象类型作键
(3) 排列方式不同
序列类型保持了元素的相对关系
而字典中的数据是无序排列的。
(4) 映射方式不同
序列类型通过地址映射到值
字典类型通过键直接映射到值
3、字典操作
(1)增加
dictionaryName[key] = value
(2)删除
del dictionaryName[key]
花括号用来定义字典,键用中括号表示
(3)遍历
for key in students:
print (key + “:”+ str(stuendents[key]))
<1>遍历字典的键key
for key in dictionaryName.keys():
print.(key)
<2>遍历字典的值value
for value in dictionaryName.values():
print.(value)
<3>遍历字典的项
for item in dicitonaryName.items():
print.(item)
<4>遍历字典的key-value
for item,value in dicitonaryName.items():
print(item, value)
<5>是否一个键在字典中
in 或者 not in
键值是一个整体,判断时,用
<6>字典的标准操作符
-,<,>,<=,>=,==,!=,and, or, not
<7>
4、词频统计
“统计词频” 问题
统计文章其中多次出现的词语、概要分析文章内容、搜索引擎
(1)坐标轴
1 import turtle 2 3 def drawLine(x1, y1, x2, y2): 4 turtle.penup() 5 turtle.goto (x1, y1) 6 turtle.pendown() 7 turtle.goto (x2, y2) 8 9 drawLine(0,0,100,100)
from turtle import Turtle def drawLine(x1, y1, x2, y2): turtle.penup() turtle.goto (x1, y1) turtle.pendown() turtle.goto (x2, y2) drawLine(0,0,100,100)
1 from turtle import * 2 3 def drawLine(t,x1, y1, x2, y2): 4 5 t.penup() 6 t.goto (x1, y1) 7 t.pendown() 8 t.goto (x2, y2) 9 10 t=Turtle() 11 drawLine(t,0,0,100,100)
1 import turtle 2 3 def drawLine(t,x1, y1, x2, y2): 4 t.penup() 5 t.goto (x1, y1) 6 t.pendown() 7 t.goto (x2, y2) 8 t=turtle.Turtle() 9 drawLine(t,0,0,0,100) 10 drawLine(t,0,0,100,0)
注意比较他们调用的不同,import turtle,这是调用了turtle库中所有函数
from turtle import Turtle 只是引入了Turtle这个函数
(2)矩形图
1 import turtle 2 3 count = 10 4 #单词频率数组-作为y轴数据 5 data = [] 6 #单词数组-作为x轴数据 7 words = [] 8 #y轴显示放大倍数-可以根据词频数量进行调节 9 yScale = 6 10 #x轴显示放大倍数-可以根据count数量进行调节 11 xScale = 30 12 13 ################# Turtle Start #################### 14 #从点(x1,y1)到(x2,y2)绘制线段 15 def drawLine(t, x1, y1, x2, y2): 16 t.penup() 17 t.goto (x1, y1) 18 t.pendown() 19 t.goto (x2, y2) 20 21 # 在坐标(x,y)处写文字 22 def drawText(t, x, y, text): 23 t.penup() 24 t.goto (x, y) 25 t.pendown() 26 t.write(text) 27 28 def drawGraph(t): 29 #绘制x/y轴线 30 drawLine (t, 0, 0, 360, 0) 31 drawLine (t, 0, 300, 0, 0) 32 33 #x轴: 坐标及描述 34 for x in range(count): 35 x=x+1 #向右移一位,为了不画在原点上 36 drawText(t, x*xScale-4, -20, x) 37 drawText(t, x*xScale-4, 15*yScale,15) 38 drawBar(t) 39 40 #绘制一个柱体 41 def drawRectangle(t, x, y): 42 x = x*xScale 43 y = y*yScale#放大倍数显示 44 drawLine(t, x-5, 0, x-5, y) 45 drawLine(t, x-5, y, x+5, y) 46 drawLine(t, x+5, y, x+5, 0) 47 drawLine(t, x+5, 0, x-5, 0) 48 49 #绘制多个柱体 50 def drawBar(t): 51 for i in range(count): 52 drawRectangle(t, i+1, 15) #可以合一块 53 ################# Turtle End #################### 54 55 t=turtle.Turtle() 56 t.hideturtle() 57 drawGraph(t) 58 drawBar(t)
(3)标点替换
1 import turtle 2 3 def replacePunctuations(line):#标点替换 4 for ch in line: 5 if ch in "~`!@#$%^&*(()_+-={}[]:;|\?.,<>""''": 6 line=line.replace(ch,"") 7 return line 8 9 infile=open("yingwen.txt","r") 10 line=infile.readline() 11 for s in infile: 12 s=replacePunctuations(s) 13 print(s)
(4)由列表转换为键值对
(5)键值对变列表
(6)交换位置,排序
1 import turtle 2 3 def replacePunctuations(line):#标点替换 4 for ch in line: 5 if ch in "~`!@#$%^&*(()_+-={}[]:;|\?.,<>\n""''": 6 line=line.replace(ch,"") 7 return line 8 9 def processLine(line,wordCOunts): 10 line=replacePunctuations(line) 11 words=line.split() 12 for word in words: 13 if word in wordCounts: 14 wordCounts[word]+=1 15 else: 16 wordCounts[word]=1 17 18 19 infile=open("yingwen.txt","r") 20 wordCounts={} 21 for line in infile: 22 processLine(line.lower(),wordCounts) #全部变为小写 23 print(wordCounts,'\n') 24 25 pairs=list(wordCounts.items()) 26 print(pairs,'\n') 27 28 items=[(x,y)for(y,x)in pairs] 29 items.sort() 30 print(items)
(7)完整代码
1 import turtle 2 3 ##全局变量## 4 #词频排列显示个数 5 count = 10 6 #单词频率数组-作为y轴数据 7 data = [] 8 #单词数组-作为x轴数据 9 words = [] 10 #y轴显示放大倍数-可以根据词频数量进行调节 11 yScale = 6 12 #x轴显示放大倍数-可以根据count数量进行调节 13 xScale = 30 14 15 ################# Turtle Start #################### 16 #从点(x1,y1)到(x2,y2)绘制线段 17 def drawLine(t, x1, y1, x2, y2): 18 t.penup() 19 t.goto (x1, y1) 20 t.pendown() 21 t.goto (x2, y2) 22 23 # 在坐标(x,y)处写文字 24 def drawText(t, x, y, text): 25 t.penup() 26 t.goto (x, y) 27 t.pendown() 28 t.write(text) 29 30 def drawGraph(t): 31 #绘制x/y轴线 32 drawLine (t, 0, 0, 360, 0) 33 drawLine (t, 0, 300, 0, 0) 34 35 #x轴: 坐标及描述 36 for x in range(count): 37 x=x+1 #向右移一位,为了不画在原点上 38 drawText(t, x*xScale-4, -20, (words[x-1])) 39 drawText(t, x*xScale-4, data[x-1]*yScale+10, data[x-1]) 40 drawBar(t) 41 42 #绘制一个柱体 43 def drawRectangle(t, x, y): 44 x = x*xScale 45 y = y*yScale#放大倍数显示 46 drawLine(t, x-5, 0, x-5, y) 47 drawLine(t, x-5, y, x+5, y) 48 drawLine(t, x+5, y, x+5, 0) 49 drawLine(t, x+5, 0, x-5, 0) 50 51 #绘制多个柱体 52 def drawBar(t): 53 for i in range(count): 54 drawRectangle(t, i+1, data[i]) 55 ################# Turtle End #################### 56 57 58 #对文本的每一行计算词频的函数 59 def processLine(line, wordCounts): 60 #用空格替换标点符号 61 line = replacePunctuations(line) 62 #从每一行获取每个词 63 words = line.split() #空格拆分,要不是单个的字符 64 for word in words: 65 if word in wordCounts:#创建键值对的过程 66 wordCounts[word] += 1 67 else: 68 wordCounts[word] = 1 69 70 #空格替换标点的函数 71 def replacePunctuations(line): 72 for ch in line: 73 if ch in "~@#$%^&*()_-+=<>?/,.:;{}[]|\'""": 74 line = line.replace(ch, " ") 75 return line 76 77 def main(): 78 #用户输入一个文件名 79 filename = input("enter a filename:").strip() 80 infile = open(filename, "r") 81 82 #建立用于计算词频的空字典 83 wordCounts = {} 84 for line in infile: 85 processLine(line.lower(), wordCounts)#变换小写 86 87 #从字典中获取数据对 88 pairs = list(wordCounts.items())#转换成列表形式 89 90 #列表中的数据对交换位置,数据对排序 91 items = [[x,y]for (y,x)in pairs] 92 items.sort() #排序 93 94 #输出count个数词频结果 95 for i in range(len(items)-1, len(items)-count-1, -1):#倒数十个数 96 print(items[i][1]+"\t"+str(items[i][0]))#输出前十的单词 和次数 97 data.append(items[i][0])#添加数值 98 words.append(items[i][1])#添加单词,全局变量 99 100 infile.close() 101 102 #根据词频结果绘制柱状图 103 turtle.title('词频结果柱状图') 104 turtle.setup(900, 750, 0, 0) 105 t = turtle.Turtle() 106 t.hideturtle() 107 t.width(3) 108 drawGraph(t) 109 110 #调用main()函数 111 main()
5、文本合并
1 def main(): 2 ftele1=open("tel.txt","rb") 3 ftele2=open("email.txt","rb") 4 5 ftele1.readline() 6 ftele2.readline() 7 lines1=ftele1.readlines() 8 lines2=ftele2.readlines() 9 10 dic1={} 11 dic2={} 12 13 for line in lines1: 14 element=line.split() 15 dic1[element[0].decode('gbk')]=str(element[1].decode('gbk')) 16 print(dic1) 17 18 for line in lines2: 19 element=line.split() 20 dic2[element[0].decode('gbk')]=element[1].decode("gbk") 21 print(dic2) 22 23 lines=[] 24 lines.append("姓名\t 邮箱\t 电话\n") 25 26 for key in dic1: 27 print(key) 28 print(dic1[key]) 29 30 for key in dic1: 31 s='' 32 if key in dic2: 33 s='\t'.join([key,dic1[key],dic2[key]]) 34 s+="\n" 35 else: 36 s="\t".join([key,dic1[key],' --- ']) 37 s+="\n" 38 print(s) 39 lines.append(s) 40 41 for key in dic2: 42 s='' 43 if key not in dic1: 44 s='\t'.join([key," --- ",dic2[key]]) 45 s+="\n" 46 print(s) 47 lines.append(s) 48 49 print(lines) 50 ftele3=open("telemail.txt","w") 51 ftele3.writelines(lines) 52 53 ftele3.close() 54 ftele1.close() 55 ftele2.close() 56 print("ok") 57 58 main()