Python中关于集合(set)的思考
又是好久没有发技术上的文章了,一方面是最近工作也比较忙,同时自己也在学习python,另外一方面是因为个人不喜欢发表一些在互联网上可以直接找到的技术文章,最起码也得加上自己的一些思考和研究才算罢了吧!
虽然python或者说集合这个东西很基础甚至很简单,但我还是想在这里白话白话自己的一个过程。
集合这个东西最早我是在数学里听到的,集合之间可以做一些运算,比如求交集,并集,归属等等。而集合在数学中算是一种散列的数据结构,通俗点来说就是无序的。既然集合是无序的,并且可以做一些集合运算,那这样其实就有很大的用途了,比如说可以比较两个集合的差异,求差集,交集,并集(其实跟没说一样,这不就是集合本身的特性么)。其实我想说的是,我们可以再抽象下,比如说,把一个文件看做集合,文件的内容看做集合的元素,那这样就可以对文件进行做简单的运算了,就可以很清楚的对比两个文件的差异了。
接下来就讲一下使用python的set集合的属性来对比文件差异,效果如下:
sh-4.1# mydiff
Please input two argvs. Example:mydiff file1 file2
sh-4.1# mydiff abc1 abc2
abc1 abc2共同拥有部分:
######################################################
Hello,My name is Andy_xu!
abc1 :特有内容
######################################################
My web_site is what?
######################################################
abc2 :特有内容
######################################################
My web_site is http://my.oschina.net/xxbAndy/blog
######################################################
执行脚本,加需要对比的两个文件名称作为参数就可以得到文件的相同部分和不同部分了。懂linux的人都知道diff工具也可以对比文件的差异,但其实还是有差异的,另外我只是针对python中的set实践一下想法,请不要耻笑我。。。。
源码部分(代码比较粗糙,不喜勿喷啊):
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
#Author-by:Andy-xu
#Contact:[QQ:371990778]
#Date:2016-07-06 16:03
#Update: 2016-08-17 23:15
#Description:利用set的特性对两个文件进行差异化对比
import sys
argvs = sys.argv
#构造两个文件集合类
class Set_file(object):
def __init__(self,file1,file2):
self.file1 = file1
self.file2 = file2
def Set_A(self):
A = set()
for file in open(self.file1).readlines():
A.add(file.strip())
return A
def Set_B(self):
B = set()
for file in open(self.file2).readlines():
B.add(file.strip())
return B
#集合运算
def Diff_Set():
try:
Set = Set_file(argvs[1],argvs[2])
Intersections = Set.Set_A() & Set.Set_B() #求交集,提取文件相同内容
print argvs[1]+" "+argvs[2]+"共同拥有部分:"
print("######################################################")
for intersection in Intersections:
print intersection
print("nnn")
Diff_SetA = Set.Set_A() - Set.Set_B() #求差集,提取file1特有内容
print(argvs[1]+" :特有内容")
print("######################################################")
if len(Diff_SetA) == 0:
print("No difference!")
for diff_set in Diff_SetA:
print(diff_set)
Diff_SetB = Set.Set_B() - Set.Set_A() #求差集,提取file2特有内容
print("######################################################")
print("nn")
print(argvs[2]+" :特有内容")
print("######################################################")
if len(Diff_SetB) == 0:
print("No difference!")
for diff_set in Diff_SetB:
print(diff_set)
print("######################################################")
except Exception,e: #捕获异常,并给与友好提示
print("Please input two argvs for the mydiff. Example:"+argvs[0]+" file1 file2 ")
if __name__ == '__main__':
Diff_Set()
思考:首先,从集合运算的角度考虑,set本身是支持一些方法来进行集合运算的,比如:
#交集
#print list(set(a).intersection(set(b)))
#并集
#print list(set(a).union(set(b)))
#b有a无
#print list(set(b).difference(set(a)))
其次,源码部分在求差集那块完全可以使用类来封装。综合来说,代码的行数还是可以再减少点滴!
关于python set的思考目前就到这里,然而关于python,我还在继续,有想法会继续和大家分享,也希望成长之路有人一起交流。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你真的理解Binder“一次拷贝“吗?
- ggplot2_boxplot
- ggplot_Violin Plot & dot plot
- 只要网速够快,小视频看完一个删一个,任性!Python爬取小视频
- ggplot barplot and error bars
- 设计稿生成游戏界面
- ggplot Stripchart and line
- ggplot2 核密度图和直方图
- 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器
- ggplot_QQ图和ECDF
- tidyverse evaluation
- 下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
- Tidyverse补充
- 抖音关键词热度搜索小程序(附源码)
- python自定义函数基础