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()
        

 

 

 

 

 

 

 

 

posted on 2017-08-17 00:02  箬笠蓑衣  阅读(699)  评论(0编辑  收藏  举报