python-组合类型【集合、文件、字典】
一、集合类型
1、{}
2、元素为不可变数据类型【列表就不行】
2、集合中元素唯一,不存在相同元素
3、集合中元素无序
4、建立集合{} 或 set(),建立空集合只能用set()
a = {1,334,'dcs',(2,'ffd')} print(a) #{'dcs', 1, (2, 'ffd'), 334} ,无序 b = set('拉拉链') print(b) #{'链', '拉'} ## 元素无序且不重复
5、集合操作符
一、文件
1、常用编码
①ASCII码--表示英文字母的二进制编码
print(ord('a')) ##97,字符转二进制 print(chr(65)) ##A,二进制转字符
②Unicode
多语言
③UTF-8
可变长的Unicode
④编码 encode()
解码decode()
⑤GBK编码--汉字编码
2、文件数据
(1)文本文件 :数字、字符(ASCII码)
\n 换行符
(2)二进制文件
3、文件基本处理
(1)文件打开
<variable> = open(<文件名>,<打开模式>)
(2)文件读取
read()
def main(): fname = input('请输入文件名:') infile = open(fname,'r',encoding='utf-8') data = infile.read() ##读取整个文件内容 print(data) main()
readline()
##读取前五行 infile = open('数中','r',encoding='UTF-8') for i in range(5): line = infile.readline() print(line[:-1]) ##去掉每行最后的换行符\n,不然输出每行之间会有一行空行
(3)文件写入
##若test文件不存在,python会创建一个test文件; ##若test文件存在,python会删掉已存在的test文件,重新创建一个test文件; outfile = open('test','w',encoding='UTF-8') outfile.writelines('Hello world!') outfile.close() infile = open('test','r',encoding='UTF-8') print(infile.read())
(4)文件遍历
文件遍历框架模板
file = open('文件名','r',encoding='UTF-8') for line in file: ##处理一行文件内容 file.close()
实例一:文件拷贝
##文件拷贝 def main(): #用户输入文件名 f1 = input('输入一个源文件名:').strip() ##strip()函数是删除字符串首尾的空格 f2 = input('输入拷贝的文件名:').strip() #打开文件 infile = open(f1,'r',encoding='UTF-8') outfile = open(f2,'w',encoding='UTF-8') #拷贝数据 countLines = countCharts = 0 for line in infile: countLines +=1 countCharts += len(line) outfile.write(line) print(countLines,'行中的',countCharts,'字符,已经被复制') infile.close() outfile.close() main()
实例二:多文件合并成一个文件
+--------->>>>
## 两个文件合并成一个 ###利用字符串和列表将两个通讯录文本合并为一个文本 def main(): f1 = open('Tele','r',encoding='UTF-8') f2 = open('Email','r',encoding='UTF-8') f1.readline()#跳过第一行 f2.readline() line1 = f1.readlines() line2 = f2.readlines() list1_name = [] list1_tele = [] list2_name = [] list2_email = [] for line in line1: ##获取第1个文件中的姓名和电话 elements = line.split() ##split()按空格进行切片 list1_name.append(str(elements[0])) list1_tele.append(str(elements[1])) for line in line2: ##获取第2个文件中的姓名和电话 elements = line.split() ##split()按空格进行切片 list2_name.append(str(elements[0])) list2_email.append(str(elements[1])) ###开始处理 lines = [] lines.append('姓名\t 电话 \t 邮箱\n') ##按索引方式遍历姓名列表1 list1_name for i in range(len(list1_name)): s = '' if list1_name[i] in list2_name: j = list2_name.index(list1_name[i])##找到list1_name对应list2_name的姓名的索引位置 s = '\t'.join([list1_name[i],list1_tele[i],list2_email[j]]) s += '\n' else: s = '\t'.join([list1_name[i],list1_tele[i],str(' ----- ')]) s +='\n' lines.append(s) #处理list2中没有匹配到的姓名 for i in range(len(list2_name)): s = '' if list2_name[i] not in list1_name: s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]]) s += '\n' lines.append(s) f3 = open('Address','w',encoding='UTF-8') f3.writelines(lines) f1.close() f2.close() f3.close() main()
二、字典(dict)
(1)字典中的元素是无序排列的
d1 = {'r':21,'b':78} d2 = {'b':78,'r':21} print(d1==d2) ##True
(2)字典元素增删改
students = {'201901':'叽叽','201902':'线线'} #访问字典元素 print(students['201902']) ##线线 #增加字典元素 students['201903']='赞赞' print(students) ##{'201901': '叽叽', '201902': '线线', '201903': '赞赞'} #删除字典中的元素 del students['201901']
(3)字典的遍历
students = {'201901':'叽叽','201902':'线线'} #字典的遍历,默认遍历字典的键key for key in students: print(key + ':' +str(students[key])) #201901:叽叽 #201902:线线 #遍历字典的值value for value in students.values(): print(value) #遍历字典的项 for item in students.items(): print(item) #('201901', '叽叽') #('201902', '线线') #遍历字典的key-value for key,value in students.items(): print(key,value) #201901 叽叽 #201902 线线
(4)判断一个元素是否在字典中
in not in
(5)字典的标准操作符
-,<,>,<=,>=,==,!=,and,or,not
(6)字典方法
#字典转列表 students = {'201901':'叽叽','201902':'线线'} li = list(students.items()) print(li)#[('201901', '叽叽'), ('201902', '线线')] 列表内的元素是tuple print(li[0]) #('201901', '叽叽') print(li[0][0]) #201901
实例一:统计词频(英文)【中文需要引入分词】
import turtle ##全局变量## #词频排列显示个数 count = 10 #单词频率数组-作为y轴数据 data = [] #单词数组-作为x轴数据 words = [] #y轴显示放大倍数-可以根据词频数量进行调节 yScale = 6 #x轴显示放大倍数-可以根据count数量进行调节 xScale = 30 ################# Turtle Start #################### # 从点(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) 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 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]) ################# Turtle End #################### ##计算一行文本的词频 def processLine(line,wordCounts): #用空格替换标点符号 line = replacePunctuations(line) #从每一行获取每个词 words = line.split() ##按空格分割字符串,返回列表 for word in words: if word in wordCounts: #wordCounts字典{'word':出现次数} wordCounts[word] += 1 #若该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() ##strip()删除首位空格 infile = open(filename,'r',encoding='UTF-8') #建立用于计算词频的空字典 wordCounts = {} for line in infile: processLine(line.lower(),wordCounts) #从字典中获取数据对 pairs = list(wordCounts.items()) #字典转成列表 #列表中数据交换位置,数据对排序 items = [[x,y]for [y,x] in pairs] items.sort() # 输出count个数词频结果 print('词\t词频') 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]) infile.close() #根据词频结果绘制柱状图 turtle.title('词频结果柱状图') turtle.setup(900,750,0,0) #设置图形窗口 t = turtle.Turtle() #初始化画笔 t.hideturtle() t.width(3) drawGraph(t) turtle.done() main()
输出
词频统计二
def getText(): txt = open('test','r',encoding='UTF-8').read() txt = txt.lower() for ch in "~@#$%^&*()_-+=<>?/,.:;{}[]|\'""": txt =txt.replace(ch,'') return txt testTxt = getText() words = testTxt.split() file = open('excludes','r',encoding='UTF-8').read() excludes = file.split() counts = {} for word in words: if word not in excludes: ##排除excludes里面的词 counts[word] = counts.get(word, 0) + 1 items = list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) ##排序 for i in range(10): word , count = items[i] print("{0:<10}{1:>5}".format(word,count))
案例二:使用字典合并两个文件
## 两个文件合并成一个 ###利用字符串和列表将两个通讯录文本合并为一个文本 def main(): f1 = open('Tele','r',encoding='UTF-8') f2 = open('Email','r',encoding='UTF-8') f1.readline()#跳过第一行 f2.readline() line1 = f1.readlines() line2 = f2.readlines() #字典方式保存 dict1={} dict2={} for line in line1: ##获取第1个文件中的姓名和电话 elements = line.split() ##split()按空格进行切片 dict1[elements[0]] = str(elements[1]) ##elements[0]为字典的键key,elements[1]为字典的值value for line in line2: ##获取第2个文件中的姓名和电话 elements = line.split() ##split()按空格进行切片 dict2[elements[0]] = str(elements[1]) ###开始处理 lines = [] lines.append('姓名\t 电话 \t 邮箱\n') for key in dict1: s = '' if key in dict2: s = '\t'.join([key,dict1[key],dict2[key]]) s += '\n' else: s = '\t'.join([key, dict1[key], str(' ----- ')]) s += '\n' lines.append(s) for key in dict2: s = '' if key not in dict1: s = '\t'.join([key, str(' ----- '), dict2[key]]) s += '\n' lines.append(s) f3 = open('Address','w',encoding='UTF-8') f3.writelines(lines) f1.close() f2.close() f3.close() main()
※※※中文分词
jieba库
import jieba print(jieba.lcut('中国是一个伟大的国家!')) #['中国', '是', '一个', '伟大', '的', '国家', '!']##返回字符串分词后的列表