-
bash技巧:求集合的交集、并集、差集、对称差集
2012-04-11 16:27:36交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。 假设 a.txt 包括 a, c, b网上转的,不错,比使用awk容易点
给定两个文件 a.txt 和 b.txt ,每行是一个记录(假设没有重复),要求输出两集合的交集、并集、差集,输出的结果只包括唯一项。交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。
假设 a.txt 包括 a, c, b 三行。假设 b.txt 包括 d, e, c, b 四行。
交集,把两个文件放到一起排序,只输出次数多于一次的项:
$ sort a.txt b.txt | uniq -d
b
c
并集,把两个文件放到一起排序,重复的项只算一次:
$ sort a.txt b.txt | uniq
a
b
c
d
e
差集(A-B),把B的元素重复2份和A的元素放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt b.txt | uniq -u
a
对称差,把两个文件放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt | uniq -u
a
d
e -
shell中使用sort和uniq实现两文件的并集,交集和差集
2019-02-19 11:35:17交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。 假设 a.txt 包括 a, c, b 三行。...给定两个文件 a.txt 和 b.txt ,每行是一个记录(假设没有重复),要求输出两集合的交集、并集、差集,输出的结果只包括唯一项。交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。
假设 a.txt 包括 a, c, b 三行。假设 b.txt 包括 d, e, c, b 四行。
交集,把两个文件放到一起排序,只输出次数多于一次的项:
$ sort a.txt b.txt | uniq -d
b
c并集,把两个文件放到一起排序,重复的项只算一次:
$ sort a.txt b.txt | uniq
a
b
c
d
e差集(A-B),把B的元素重复2份和A的元素放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt b.txt | uniq -u
a对称差,把两个文件放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt | uniq -u
a
d
e -
文件交集差集等等随笔
2016-10-26 15:27:04交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。 假设 a.txt 包括 a,网上转的,不错,比使用awk容易点
给定两个文件 a.txt 和 b.txt ,每行是一个记录(假设没有重复),要求输出两集合的交集、并集、差集,输出的结果只包括唯一项。交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。
假设 a.txt 包括 a, c, b 三行。假设 b.txt 包括 d, e, c, b 四行。
交集,把两个文件放到一起排序,只输出次数多于一次的项:
$ sort a.txt b.txt | uniq -d
b
c
并集,把两个文件放到一起排序,重复的项只算一次:
$ sort a.txt b.txt | uniq
a
b
c
d
e
差集(A-B),把B的元素重复2份和A的元素放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt b.txt | uniq -u
a
对称差,把两个文件放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt | uniq -u
a
d
e
-
Python学习笔记--集合运算
2019-07-18 15:56:10集合运算交集差集对称差集并集补集拓展集合相关的判断集合的应用集合的限制总结 交集 差集 对称差集 并集 补集 拓展 异或定义 异或常用场景 集合相关的判断 集合的应用 集合的限制 总结 ...交集
数学定义:集合论中,设A,B是两个集合,有所有属于A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。
**交集的定义:**存在集合A和B,对于集合C,如果C的每个元素既是A的元素,又是B的元素,并且A和B所有相同的元素都在C里找到,那么C是A和B的交集。
>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1.intersection(s2) {2, 3}
如上,intersection()方法可以得到两个集合的交集,是原地不修改,有返回值。
>>> s2.intersection_update(s1) >>> s1 {1, 2, 3} >>> s2 {2, 3}
如上,intersection_update()方法原地修改,返回None。等效于
s2 = s1.intersection(s2)
。>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1 & s2 {2, 3} >>> s1 {1, 2, 3} >>> s2 {2, 3, 4} >>> s2 & s1 {2, 3}
如上,set重载了按位与运算符&为求交集的运算,即,集合中的&与intersection实现了同样的功能。为方便可以直接使用&会更清楚一些。
(重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。)差集
数学定义:记A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做集合A减集合B(或集合A与集合B之差),类似地,对于集合A、B,我们把集合 叫做A与B的差集。
**差集定义:**集合A和集合B,当集合C的元素仅仅存在于A中,但不存在于B中,并且A中存在、B中不存在的元素全部存在C中,那么C是A和B的差集。
>>> s1.difference(s2) {1} >>> s1 {1, 2, 3} >>> s2 {2, 3, 4} >>> s2.difference(s1) {4}
如上可知,差集如果互换顺序会产生差异,差集是不具备交换律的。
>>> s1.difference_update(s2) >>> s1 {1} >>> s2 {2, 3, 4}
如上,差集的difference_update()方法,原地修改,返回None,相当于
s1 = s1.difference(s2)
运算重载符:
>>> s1 - s2 {1} >>> s2 - s1 {4} >>> s1 {1, 2, 3} >>> s2 {2, 3, 4}
所以,set重载了运算符-,执行了差集计算,相当于
s1.difference(s2)
对称差集
数学定义:集合A与集合B的对称差集定义为集合A与集合B中所有不属于A∩B的元素的集合,记为,即。
**对称差集的定义:**一个元素,要么在集合A中,要么在集合B中>>> s1.symmetric_difference(s2) {1, 4} >>> s2.symmetric_difference(s1) {1, 4} >>> s1 {1, 2, 3} >>> s2 {2, 3, 4}
对称差集是可以交换的,并且返回的值恰好是交集的补集
所以:如果把两个集合A和B看成一个全集,对称差集就是交集的补集>>> s1.symmetric_difference_update(s2) >>> s1 {1, 4} >>> s2 {2, 3, 4}
对称差集也有symmetric_difference_update()方法,原地修改,返回None,相当于
s1 = s1.symmetric_difference(s2)
对称差集重载了异或运算符,相当于
s1 = s1.symmetric_difference(s2)
>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1 ^ s2 {1, 4} >>> s2 ^ s1 {1, 4}
并集
数学定义:若A和B是集合,则A和B并集是所有A的元素和所有B的元素,而没有其他元素的集合。A和B的并集通常写作“A∪B”,即:
>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1.union(s2) {1, 2, 3, 4} >>> s2.union(s1) {1, 2, 3, 4}
并集也有交换律,但是并集的_update版本就是update
>>> s1.update(s2) >>> s1 {1, 2, 3, 4} >>> s2 {2, 3, 4}
并集的重载运算符为|,set重载了按位或运算符,用于并集计算。
>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1 | s2 {1, 2, 3, 4} >>> s2 | s1 {1, 2, 3, 4}
补集
数学定义:补集一般值绝对补集,即一般地,设S是一个集合,A是S的一个子集,由S中所有不属于A的元素组成的集合,叫做子集A在S中的绝对补集。
拓展
- 异或定义
>>> 5 ^ 2 7 >>> bin(5) '0b101' >>> bin(2) '0b10' >>> bin(7) '0b111'
- 异或常用场景
交换2个整数的值而不必用第三个参数
>>> a = 9 >>> b = 11 # 1001 ^ 1011 = 0010 >>> a = a ^ b >>> a 2 >>> b 11 #1011 ^ 0010 = 1001 >>> b = b ^ a >>> a 2 >>> b 9 #0010 ^ 1001 = 1011 >>> a = a ^ b >>> a 11 >>> b 9
集合相关的判断
- 子集、超集
数学定义:如果一个集合s2中的每一个元素都在集合s1中,且集合s1中可能包含s2中没有的元素,则集合s1就是s2的一个超集,反过来,s2是s1的子集。
集合A里所有元素都能在集合B里找到,那么A是B的子集,B是A的超集。
判断s2是否是s1的子集:
>>> s1 = {1, 2, 3, 4} >>> s2 = {2, 3} >>> s2.issubset(s1) True #判断s1是否是s2的超集: >>> s1.issuperset(s2) True
简单实现一个自己的版本;
def issubset(s1, s2): for x in s1: if x not in s2: return False return True def issuperset(s1, s2): for x in s2: if x not in s1: return False return True #isdisjoint判断2个集合是否有交集,如果有交集就返回False,没有交集就返回True s1.isdisjoint(s2) >>> s3 = {1, 2} >>> s4 = {3, 4} >>> s3.isdisjoint(s4) True
集合的应用
- 去重
- 集合运算更快
-
有一个API,他要有认证,并且有一定权限才可以访问:
例如:要求满足权限A,B,C中任意一项,有一个用户具有权限B,C,D,那么此用户是否有权限访问此API? 通过isdisjoint的方法,返回False即可。
集合的限制
- 目前学的数据结构有:
- 列表
- 元组
- 字符串
- bytes
- bytearray
- 集合
- 哪些数据结构对元素有限制:
- bytes
- bytearray
- str
- 集合有没有限制:
集合的特性:元素不会重复
如果一个元素不可以比较,那么就不能放到集合里,因为无法做出判断是否有重复
>>> {1, 2, 3}#整形可以 {1, 2, 3} >>> {'a', 'b', 'c'}#字符也可以 {'b', 'c', 'a'} >>> {1, 'a'}#混着也可以 {1, 'a'} >>> {(1, 2)}#元组也可以 {(1, 2)} >>> {b'abc'}#bytes也可以 {b'abc'}
但是也有限制
>>> {[1, 2, 3],[2, 3, 4]} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>> {bytearray(b'abc')} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'bytearray'
list不能是集合的元素,bytearray不能是集合的元素,连set自己也不能做集合的元素。
什么样的元素可以作为集合的元素,什么样的元素不能作为集合的元素?
- 集合元素必须可hash
>>> hash(1) 1 >>> hash('abc') -3496128926335596964 >>> hash(b'abc') -3496128926335596964 >>> hash((1, 2)) 3713081631934410656 #以下为不行 >>> hash([1, 2]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' #依次类推
list、bytearray、set是可变的,是不可hash的。
总结
-
利用linux命令sort和uniq求两个文件的交集并集和补集
2015-09-14 10:23:28交集定义为同时出现在两个文件中的记录项,并集定义为出现在任何一个文件中的记录项,差集(A-B)定义为出现在A中而且不出现在B中的记录,对称差集定义为只出现在一个文件中的记录。 假设 a.txt 包括 a, c, b 三... -
Python_5_Python的封装与解构-集合
2019-04-18 19:41:17文章目录1. 封装与解构1.1. 封装1.2. 解构1.3. Python3 的解构2. set 类型2.1. set 的定义2.2. set 的基本操作2.2.1. 增加元素2.2.2. 删除元素2.2.3.... 对称差集3.6. 集合的其他运算 1. 封装与解构... -
集合的运算关系
2019-08-15 23:20:14运算关系总共有:交集,并集,差集,对称差集 交集:set1&set2 并集:set1|set2 差集:set1-set2表示属于set1但不属于set2的集合 对称集:set1^set2=(set1-set2)|(set2-set1) 空集合的时候只能用set()函数... -
Python求多个list的交集、并集、差(补)集的方法
2019-03-19 09:33:19文章目录摘要1....本文主要介绍在Python下求两个list的交集、并集、差(补)集、对称差集的方法,如何在Python中对变量名进行动态地定义,介绍以下两种常用的情况: 1.定义如a1=1,a2=2,a3=3这... -
python集合的介绍、创建、添加、删除、遍历等以及enumerate函数的使用
2018-12-29 20:57:29集合对象还支持交集(intersection),差集(difference)、并集和对称差集(sysmmetric_difference) 集合的基本功能包括关系测试和消除重复元素 集合定义: (1) . 变量名={元素1,元素2,元素3,…} (2) . 变量名=set... -
C++ STL(第十九篇:算法-- set相关算法)
2019-04-30 09:24:38STL 一共提供了四种与set相关的算法,分别是并集、交集、差集、对称差集。 所谓set,可细分为数学上的定义和STL 的定义两种,数学上的 感谢大家,我是假装很努力的YoungYangD(小羊)。 参考资料: 《STL源码... -
差分隐私中的组合性质-串行,并行,推论
2020-04-21 18:52:49文章目录Laplace噪声的概率累积函数Laplace噪声概率函数Laplace噪声的概率累积函数兄弟数据集解释对称差集⨁\bigoplus⨁差分隐私定义概念延展(完整版)差分隐私的组合原理差分隐私的串行组合原理差分隐私的并行组合... -
python-集合
2019-04-17 17:55:00集合类似列表,无序,不重复,集合中没有重复的数据,不能根据下标取值空集合:set()空元组:tuple()空列表:list()非空集合: {123}...交集、差集、并集、反向差集、对称差集定义集合 list = [2,3,1,2,3,4] s_list = ... -
我的Python成长之路---第三天---Python基础(9)---2016年1月16日(雾霾)
2016-01-17 14:12:00集合和我们数学中集合的概念是一样的,也有交集,并集,差集,对称差集等概念 1、集合的定义 定义一个集合需要提供一个列表作为参数,也可以不传入参数创建一个空的集合 >>> s = set([1, 2, 2... -
python基础操作之集合
2019-09-14 14:04:31集合(set)概述特点操作定义增删清空计算长度(len)判断交集、并集、对称交集、差集交集并集对称差集(反交集)差集父集、子集子集 概述 集合(set):把不同的元素组成在一起形成一个集合,集合是python的一个基本... -
python变量类型是集合_Python数据类型详解-集合#学习猿地
2020-12-17 13:05:25当前集合中元素的值不能重复+ 由多个数据组合的复合型数据(容器类型数据)+ 集合中的数据没有顺序+ 功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。### 集合的... -
Python数据类型详解-集合#学习猿地
2020-03-17 15:00:58+ 功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。 ### 集合的定义 + 可以直接使用 {} 来定义集合 + 可以使用set()进行集合的定义和转换 + 使用集合推导式... -
python中集合数据类型_Python数据类型详解-集合#学习猿地
2020-11-30 07:20:35当前集合中元素的值不能重复+ 由多个数据组合的复合型数据(容器类型数据)+ 集合中的数据没有顺序+ 功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。### 集合的... -
python集合
2018-06-13 16:23:00(2)关系测试:交集、差集、并集、对称差集、反向差集 2、,集合与字典很相近,字典是{k:v}形式的,而集合是{1,2}形式的,集合是无序的,不能用下标取值 list={}是定义一个空字典而不是集合 如果想定义... -
数据类型详解-集合
2020-08-05 19:55:46文章目录什么是集合?...功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。 集合的定义 可以直接使用 {} 来定义集合 可以使用set()进行集合的定义和转换 使用集 -
数据类型详解之集合
2020-06-15 16:51:07功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。 1.集合的定义 可以直接使用 {} 来定义集合 可以使用set()进行集合的定义和转换 使用集合推导式完成集合的定义 ... -
python 集合
2018-06-11 16:30:001、 集合是无序的,能去重,集合还能进行关系测试-取的2个集合里面的交集、并集、差集、对称差集 2、定义一个集合,会自动去重 变量名=set(变量名) 例如 list=[1,2,3,4,4] list=set(list) list.add(777)#往... -
集合论基本概念与其运算
2020-09-21 22:24:57全集与空集定理:空集是任何集合的子集定理:空集是惟一的幂集幂集的定义基数的定义定理:幂集元素个数定理集合的运算集合的交集∩集合的并集∪集合的补集 ~(绝对补)集合的差集 -(相对补)集合的对称差集+文氏图... -
Python-集合
2017-02-20 20:51:00集合还支持 交集、并集、差集、对称差集 备注:由于集合是无序的,所以不支持 索引、分片和其它序列的操作 下面我们来做一下实操: 定义一个集合 #集合 s = {3,2,5,8,9} #直接定义 s1 = set([1,3,4... -
Python基础(四):set类型
2018-10-13 10:09:03还可以进行交集、差集、并集和对称差集的运算。 set是一种无序集合,不能通过索引获取元素。可以通过“in”判断set集合是否含有一个元素,若含有返回True,否则返回False。 set的内部结构和dict很想,不同之处在于... -
Python学习--集合(set)
2018-03-08 19:21:51集合的概念 在 Python 中,集合由内置的 set 类型...集合的运算同数学运算一样,有交集、并集、差集集对称差集。 交集:.intersection 或者(符号:&amp;amp;amp;) 并集:.union 或者(符号:|) 差...