嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=10211084839195730432#page=25 中的42-45讲 {字典}

#coding=gbk
#嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=10211084839195730432#page=25 中的42-45讲 {字典}
#字典:针对非序列集合而提供的一种数据类型
# 字典是无序的!!!!!
#字典类型与序列类型的区别:
# 存取和访问方式不同
# 键类型不同,序列类型只能用数字类型的键,字典类型可以用其它对象作为键,如数字,字符串,元组等。
# 序列类型有序,字典类型无序
# 序列类型通过地址映射到值,字典中的键直接映射到值
#
#字典的操作
#为字典增加一项:dictionaryName[key] = value
#访问字典中的值:dictionaryName[key]返回键key对应的值value,若键不存在,则报错
#删除字典中的一项:del dictionaryName[key]
#字典的遍历:for key in dictionaryName:
# print(key + ":" + str(dictionaryName[key]))
#遍历字典的键:for key in dictionaryName.keys():print(key)
#遍历字典的值:for value in dictionaryName.values():print(value)
#遍历字典的项:for item in dictionaryName.items():print(item)
#遍历字典的键值:for item,value in dictionaryName.items():print(item,value)
#
#是否一个键在字典中用in not in指令
#字典的标准操作符:
#-,<, >, <=, >=, ==, !=, and, or, not
#
#字典方法
#keys():tuple 返回一个包含字典所有key的列表
#values():tuple 返回一个包含字典所有value的列表
#items():tuple 返回一个包含所有键值的列表
#clear():None 删除字典中的所有项目
#get(key):value 返回字典中key对应的值
#pop(key):value 删除并返回字典中Key对应的值
#update(字典) 将字典中的键值添加到字典中
"""
#英文文本文件词频统计程序
import turtle
#全局变量
#词频非排列显示个数
count = 10
data = []
words = []
yScale = 0.3 #y轴显示放大倍数可以根据词频统计数量count进行调整
xScale = 30 #x轴显示放大倍数可以根据词频统计数量count进行调整

def drawLine(t,x1,y1,x2,y2): #从点(x1,y1)到(x2,y2)绘制线段
  t.penup()
  t.goto(x1,y1)
  t.pendown()
  t.goto(x2,y2)

def drawText(t,x,y,text): #在坐标(x,y)处写文字
  t.penup()
  t.goto(x,y)
  t.pendown()
  t.write(text)

def drawGraph(t): #绘制x/y轴线
  drawLine(t,0,0,360,0)
  drawLine(t,0,300,0,0)

  for x in range(count):
    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 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, 0, x-5, 0)

def drawBar(t):
  for i in range(count):
    drawRectangle(t, i+1, data[i])

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

#空格替换标点的函数
def replacePunctuations(line):
  for ch in line:
    if ch in "~!@#$%^&*()-_+=[]{}|;:'""<>,./?":
      line = line.replace(ch, '')
    return line

def main():
  filename = input("请输入一个英文编写的文本文件: ").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] + " " + 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()函数
  if __name__ == '__main__':
    main()

main()
"""

ftele1 = open(r'C:UsersfengboDesktop电话1106.txt','rb')
ftele2 = open(r'C:UsersfengboDesktop邮箱1106.txt','rb')

ftele1.readline() #跳过第一行
ftele2.readline() #跳过第一行
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()
dic1 = {}
dic2 = {}

for line in lines1:
  elements = line.split()
  dic1[elements[0]] = str(elements[1].decode('gbk'))

for line in lines2:
  elements = line.split()
  dic2[elements[0]] = str(elements[1].decode('gbk'))


#电话邮箱合并程序
lines = []
lines.append('姓名 电话 邮箱 ')

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

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

ftele3 = open(r'‪C:UsersfengboDesktop电话邮箱1106.txt', 'w')
ftele3.writelines(lines)
ftele3.close()
ftele2.close()
ftele1.close()

原文地址:https://www.cnblogs.com/fengbo1113/p/7798505.html