办公常用软件技术学习网

办公常用软件技术学习网、Excel技术学习、PPT技术学习、Word技术学习、AI技术学习、PS技术学习,开发技术,数据库开发,SEO教程

联系客服联系客服

您现在的位置是:首页>技术开发>无序的集合:Python中的数学集合运算

无序的集合:Python中的数学集合运算

2020-09-30 14:24 栏目:技术开发

set是Python中无序的集合,它可以用于计算标准数学运算,例如交集、并集、差集和对称差集,Other集合(例如列表、元组和字典)不支持集合操作,Dict视图对象类似于集合,可以进行集合操作。本文将详细探讨set对象支持的数学运算。

先来看一下Set对象支持的数学运算:

  • union()
  • update()
  • intersection()
  • intersection_update()
  • difference()
  • difference_update()
  • symmetric_difference()
  • symmetric_difference_update()
  • isdisjoint()
  • issubset()
  • issuperset()

Set运算操作可以通过两种方式完成:使用方法或运算符。

‘union()’

返回一个新集合,其中包含该set和other集合中的元素,使用union()或“|“算子。

语法:

  1. union(*others) 
  2. set | other | ... 


示例1:找到两个集合的并集—A和B

返回一个包含集合A和集合B中的元素的新集合。但元素不会重复,集合中的所有元素都是唯一的。

  1. A={1,2,3,4,5} 
  2. B={2,4,6,8} 
  3. print (A.union(B))#Output:{1, 2, 3, 4, 5, 6, 8} 
  4. print (A|B)#Output:{1, 2, 3, 4, 5, 6, 8} 

示例2:查找两个以上集合的并集

  1. A={1,2,3,4,5} 
  2. B={2,4,6,8,10} 
  3. C={1,3,5,7,9} 
  4. print (A|B|C)#Output:{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 
  5. print (A.union(B,C))#Output:{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

union()方法和|之间的区别:

  • union():接受任何可迭代的参数
  • |运算符:仅接受set作为参数,否则将引发TypeError。

示例3:在union()方法中将iterable用作参数

  1. A={1,2,3,4,5} 
  2. #iterable is given as list 
  3. print (A.union([2,4,6]))#Output:{1, 2, 3, 4, 5, 6} 
  4. #iterable is given as tuple 
  5. print (A.union((2,4,6)))#Output:{1, 2, 3, 4, 5, 6} 
  6. #iterable is given as range object 
  7. print (A.union(range(5,10)))#Output:{1, 2, 3, 4, 5, 6, 7, 8, 9} 
  8. #iterable is given as a dictionary 
  9. print (A.union({'a':6,'b':7}))#Output:{1, 2, 3, 4, 5, 'b''a'

示例4:为|提供参数iterable

  1. A={1,2,3,4,5} 
  2. B=[1,2,3] 
  3. print (A|B) 
  4. #Output:TypeError: unsupported operand type(s) for |: 'set' and 'list' 

‘update()’

更新集合,并从other集合中添加元素,元素不会重复,集合中的所有元素都是唯一的。通过使用update() 或使用|=运算符来执行,返回类型为None,将修改原始集本身。

语法:

  1. update(*others) 
  2. set |= other | ... 

示例1:在A和B两个集合之间调用update()

通过添加两个集合中的元素来更新集合A。

  1. #update() 
  2. A={1,2,3,4,5} 
  3. B={4,5,6,7,8} 
  4. print (A.update(B)) #Output: None 
  5. print (A) #Output: {1, 2, 3, 4, 5, 6, 7, 8}A={1,2,3,4,5} 
  6. B={4,5,6,7,8} 
  7. A|=B 
  8. print (A) #Output: {1, 2, 3, 4, 5, 6, 7, 8} 

示例2:在两个以上集合之间调用update()

  1. #update() 
  2. A={1,2,3} 
  3. B={3,4,5} 
  4. C={5,6,7} 
  5. print (A.update(B,C)) #Output: None 
  6. print (A) #Output: {1, 2, 3, 4, 5, 6, 7} 
  7. A={1,2,3} 
  8. B={3,4,5} 
  9. C={5,6,7} 
  10. A|=B|C 
  11. print (A) #Output: {1, 2, 3, 4, 5, 6, 7} 

update() 方法和|=运算符之间的区别:

  • update() :接受任何可迭代的参数。
  • =运算符:仅接受set作为参数,否则将引发TypeError。

示例3:在update() 方法中将iterable用作参数

  1. A={1,2,3} 
  2. #iterable is given as list 
  3. print (A.update([2,3,4]))#Output:None 
  4. print (A)#Output:{1,2,3,4} 
  5. #iterable is given as tuple 
  6. A={1,2,3} 
  7. A.update((2,3,4)) 
  8. print (A)#Output:{1,2,3,4} 
  9. #iterable is given as range object 
  10. A={1,2,3} 
  11. A.update(range(2,5)) 
  12. print (A)#Output:{1,2,3,4} 
  13. #iterable is given as a dictionary 
  14. A={1,2,3} 
  15. A.update({2:'a',3:'b'}) 
  16. print (A) #Output:{1, 2, 3} 

示例4:为|=运算符提供参数iterable:

  1. #iterable is given as tuple 
  2. A={1,2,3} 
  3. B=(3,4) 
  4. A|=B#Output:TypeError: unsupported operand type(s) for |=: 'set' and 'tuple' 

‘intersection()’

返回一个具有该集合和other集合共同元素的新集合,通过intersection()或使用&运算符来执行。

语法:

  1. intersection(*others) 
  2. set & other & ... 


示例1:找到两个集合的交集—A和B

返回一个新集合,其中包含集合A和集合B中的共同元素。

  1. A={1,2,3,4,5} 
  2. B={2,4,6,8} 
  3. #intersection is performed by intersection() method or & operator 
  4. print (A.intersection(B))#Output:{2,4} 
  5. print (A&B)#Output:{2,4} 

示例2:找到两个以上的交集

  1. A={1,2,3,4,5} 
  2. B={2,4,6,8,10} 
  3. C={2,4} 
  4. print (A&B&C)#Output:{2,4} 
  5. print (A.intersection(B,C))#Output:{2,4} 

intersection()方法和&运算符之间的区别:

  • intersection():接受任何可迭代的参数。
  • &运算符:仅接受set参数,否则将引发TypeError。

示例3:在intersection()方法中将iterable用作参数

  1. A={1,2,3,4,5} 
  2. #iterable is given as list 
  3. print (A.intersection([1,4,6]))#Output:{1,4} 
  4. #iterable is given as tuple 
  5. print (A.intersection((2,4,6)))#Output:{2,4} 
  6. #iterable is given as range object 
  7. print (A.intersection(range(5,10)))#Output:{5} 
  8. #iterable is given as a dictionary 
  9. print (A.intersection({1:'a','b':7}))#Output:{1} 

示例4:为&运算符提供参数iterable

  1. A={1,2,3,4,5} 
  2. B=[1,2,3] 
  3. print (A&B) 
  4. #Output:TypeError: unsupported operand type(s) for &: 'set' and 'list' 

‘intersection_update()’

更新集合,只保留集合和other中共同的元素。可以通过使用 intersection_update()或使用&=运算符来执行,返回类型为None,将修改原始集本身。

语法:

  1. intersection_update(*others) 
  2. set &= other & … 

示例1:找到两个集合A和B之间的 intersection_update()

通过仅保留在两个集合中找到的元素来更新集合A。

  1. #intersection_update() 
  2. A={1,2,3,4,5} 
  3. B={4,5,6,7,8} 
  4. print (A.intersection_update(B)) #Output: None 
  5. print (A) #Output: {4,5}A={1,2,3,4,5} 
  6. B={4,5,6,7,8} 
  7. A&=B 
  8. print (A) #Output: {4,5} 

‘difference()’

返回一个去除other中元素之后的新集合,通过difference() 或使用-运算符来执行。

语法:

  1. difference(*others) 
  2. set - other - ... 

5A9ce2dee869952e2e78.png" target="_blank">

  • A={1,2,3,4,5} 
  • B={2,4,6,8} 
  • print (A.difference(B))#Output:{1,3,5} 
  • print (A-B)#Output:{1,3,5} 
  • 示例2:找出两个以上集合之间的差异

    1. A={1,2,3,4,5} 
    2. B={2,4,6,8,10} 
    3. C={2,3} 
    4. print (A-B-C)#Output:{1,5} 
    5. print (A.difference(B,C))#Output:{1,5} 

    difference()方法和-运算符之间的区别:

    • difference():接受任何可迭代的参数
    • -运算符:仅接受set作为参数。否则将引发TypeError。

    示例3:在difference()方法中将iterable作为参数

    1. A={1,2,3,4,5} 
    2. #iterable is given as list 
    3. print (A.difference([1,2,3]))#Output:{4,5} 
    4. #iterable is given as tuple 
    5. print (A.difference((1,2,3)))#Output:{4,5} 
    6. #iterable is given as range object 
    7. print (A.difference(range(1,4)))#Output:{4,5} 
    8. #iterable is given as a dictionary 
    9. print (A.difference({1:'a',2:'b',3:'c'}))#Output:{4,5} 

    示例4:为-运算符提供参数iterable

    1. A={1,2,3,4,5} 
    2. B=[1,2,3] 
    3. print (A-B) 
    4. #Output:TypeError: unsupported operand type(s) for -: 'set' and 'list' 

    ‘difference_update()’

    从other集合中删除该集合中的元素,通过使用-= 运算符或使用difference_update() 方法来执行,返回类型为None,将修改原始集本身。

    句法:

    1. difference_update(*others) 
    2. set -= other | ... 

    示例1:找出A和B两组之间的差异

    返回一个新集合,其中包含在集合A而不在集合B中的元素。

    1. A={1,2,3,4,5} 
    2. B={2,4,6,8} 
    3. print (A.difference(B))#Output:{1,3,5} 
    4. print (A-B)#Output:{1,3,5} 

    示例2:找出两个以上集合之间的差异

    1. A={1,2,3,4,5} 
    2. B={2,4,6,8,10} 
    3. C={2,3} 
    4. print (A-B-C)#Output:{1,5} 
    5. print (A.difference(B,C))#Output:{1,5} 

    difference()方法和-运算符之间的区别:

    • difference():接受任何可迭代的参数
    • -运算符:仅接受set作为参数。否则将引发TypeError。

    示例3:在difference()方法中将iterable作为参数

    1. A={1,2,3,4,5} 
    2. #iterable is given as list 
    3. print (A.difference([1,2,3]))#Output:{4,5} 
    4. #iterable is given as tuple 
    5. print (A.difference((1,2,3)))#Output:{4,5} 
    6. #iterable is given as range object 
    7. print (A.difference(range(1,4)))#Output:{4,5} 
    8. #iterable is given as a dictionary 
    9. print (A.difference({1:'a',2:'b',3:'c'}))#Output:{4,5} 

    示例4:为-运算符提供参数iterable

    1. A={1,2,3,4,5} 
    2. B=[1,2,3] 
    3. print (A-B) 
    4. #Output:TypeError: unsupported operand type(s) for -: 'set' and 'list' 

    ‘difference_update()’

    从other集合中删除该集合中的元素,通过使用-= 运算符或使用difference_update() 方法来执行,返回类型为None,将修改原始集本身。

    句法:

    1. difference_update(*others) 
    2. set -= other | ... 

    示例1:找到两个集合A和B之间的difference_update()

    通过删除集合A和集合B中都存在的元素来更新集合A。

    1. A={1,2,3,4,5} 
    2. B={2,4,6} 
    3. #Return type is None. 
    4. print (A.difference_update(B))#Output:None 
    5. #It will update the original set 
    6. print (A) #Output: {1,3,5} 
    7. # difference_update by using -= operator 
    8. A-=(B) 
    9. print (A) #Output: {1,3,5} 

    示例2:查找两个以上集合之间的difference_update

    1. #difference_update() will modify the original set
    2. A={1,2,3} 
    3. B={1} 
    4. C={2} 
    5. #Return type is None. 
    6. print (A.difference_update(B,C))#Output:None 
    7. #It will update the original set 
    8. print (A) #Output: {3} 
    9. # difference_update by using -= operator 
    10. A={1,2,3} 
    11. B={1} 
    12. C={2} 
    13. A-=B|C 
    14. print (A) #Output: {3} 

    difference_update()方法与-=运算符的区别:

    • difference_update():接受任何可迭代的参数
    • -=运算符:仅接受set参数,否则将引发TypeError。

    示例3:在difference_update()方法中将iterable作为参数

    1. #iterable is given as list 
    2. A={1,2,3} 
    3. B=[1] 
    4. print (A.difference_update(B))#Output:None 
    5. print (A)#Output:{2,3} 

    示例4:为-=运算符提供参数iterable

    1. A={1,2,3} 
    2. B=[1] 
    3. A-=Bprint (A)#Output: TypeError: unsupported operand type(s) for -=: 'set' and 'list' 

    ‘symmetric_difference()’

    返回一个新集合,该集合中的元素属于集合或other,但不包含两个集合共有的元素。通过symmetric_difference()或使用^运算符来执行。

    语法:

    1. symmetric_difference(other) 
    2. set ^ other 

    示例1:找到A和B两组之间的对称差

    返回一个新集合,其中包含来自集合A和集合B的元素,但不包含两个集合中共同的元素。

    1. A={1,2} 
    2. B={2,3} 
    3. print (A.symmetric_difference(B))#Output:{1,3} 
    4. print (A^B)#Output:{1,3} 

    示例2:对称差集仅适用于2个集合

    多个集合不支持symmetric_difference()方法,如果给出两个以上的集合,则会引发TypeError。

    1. A={1,2} 
    2. B={2,3,5} 
    3. C={3,4} 
    4. print (A.symmetric_difference(B,C))#Output:TypeError:symmetric_difference() takes exactly one argument (2 given) 

    但是我们可以使用^找到多个集合的对称差集

    1. A={1,2} 
    2. B={2,3,5} 
    3. C={3,4} 
    4. print (A^B^C)#Output:{1,4,5} 

    symmetric_difference()方法和^运算符之间的区别:

    • symmetric_difference():接受任何可迭代的参数,但此方法不允许使用多个集合。
    • ^运算符:它将仅接受set作为参数。否则,将引发TypeError。通过使用^运算符,可以找到多个集合之间的对称差集。

    示例3:在symmetric_difference()方法中将iterable作为参数

    1. #iterable is given as list 
    2. A={1,2,3} 
    3. B=[1] 
    4. print (A.symmetric_difference(B))#Output:{2,3} 
    5. #iterable is given as tuple 
    6. A={1,2,3} 
    7. B=(1,) 
    8. print (A.symmetric_difference(B))#Output:{2,3} 
    9. #iterable is given as range object 
    10. A={1,2,3} 
    11. B=range(2) 
    12. print (A.symmetric_difference(B))#Output:{2,3} 

    示例4:为^运算符提供参数iterable:

    1. A={1,2,3} 
    2. B=[1] 
    3. A^Bprint (A) #Output: TypeError: unsupported operand type(s) for ^: 'set' and'list' 

    ‘symmetric_difference_update()’

    更新集合,保留在两个集合中均找到的元素并去除两个集合中的公共元素。可以通过使用symmetric_difference_update()或使用^=运算符来实现,返回类型为None,将修改原始集本身。

    语法:

    1. symmetric_difference_update(other) 
    2. set ^= other 

    示例1:在A和B两组之间找到symmetric_difference_update()

    将通过仅保留能在任一集合中找到,但不在两个集合中同时出现的元素来更新集合A。

    1. #symmetric_difference_update() 
    2. A={1,2,3,4,5} 
    3. B={4,5,6,7,8} 
    4. print (A.symmetric_difference_update(B)) #Output: None 
    5. print (A) #Output: {1, 2, 3, 6, 7, 8} 
    6. A={1,2,3,4,5} 
    7. B={4,5,6,7,8} 
    8. A^=B 
    9. print (A) #Output: {1, 2, 3, 6, 7, 8} 

    ‘isdisjoint()’

    如果该集合没有共同元素,则返回True。当且仅当它们的交集为空集时,这时称集合之间无连接。

    语法:

    1. isdisjoint(other) 

    5A14c6f7f809.png" target="_blank">

  • #Set A and Set B containing common elements 
  • A={1,2,3,4,5} 
  • B={4,5,6,7,8} 
  • print (A.isdisjoint(B))#Output:False 
  • #Set A and Set B not containing common elements 
  • A={1,2} 
  • B={3,4} 
  • print (A.isdisjoint(B))#Output:True 
  • ‘issubset()’

    测试集合中的每个元素是否都在other元素中。

    语法:

    1. issubset(other) 
    2. set <= other 

    示例:检查集合A是否为集合B的子集

    可以通过issubset()方法或使用≤运算符来完成。

    1. A={1,2,3,4,5} 
    2. B={4,5,6,7,8} 
    3. print (A.issubset(B)) #OutputFalse 
    4. print (A<=B)#OutputFalse 
    5. A={1,2,3} 
    6. B={1,2,3,4,5} 
    7. print (A.issubset(B)) #OutputTrue 
    8. print (A<=B)#OutputFalse 

    Proper subset

    测试集合是否为other的真子集,即set <= otherand set != other。

    句法:

    1. set < other 

    示例:检查集合A是否是B的真子集

    如果两个集合相等,则意味着 A.issubsetset(B) 返回True,但是真子集A

    1. A={1,2,3,4,5} 
    2. B={4,5,6,7,8} 
    3. print (A<B)#OutputFalse 
    4. A={1,2,3,4,5} 
    5. B={1,2,3,4,5} 
    6. print (A<B)#OutputFalse 
    7. A={1,2,3} 
    8. B={1,2,3,4,5} 
    9. print (A<B)#OutputTrue 

    ‘issuperset()’

    测试other中的每一个元素是否在集合中。

    语法:

    1. issuperset(other) 
    2. set >= other 

    示例:检查集合A是否为B的超集

    可以通过issuperset()方法或使用≥运算符来实现:

    1. A={1,2,3,4,5} 
    2. B={4,5,6,7,8} 
    3. print (A.issuperset(B)) #OutputFalse 
    4. print (A>=B)#Output:True 
    5. A={1,2,3,4,5} 
    6. B={1,2,3} 
    7. print (A.issuperset(B)) #OutputTrue 
    8. print (A>=B)#Output:True 

    Proper superset

    测试集合是否是other集合的真超集,即,set >= otherand set != other。

    语法:

    1. set > other 

    示例:检查集合A是否为B的真超集。

    如果两个集合相等,则意味着A.issuperset(B)返回True,但是真超集A> B将返回False。

    1. A={1,2,3,4,5} 
    2. B={4,5} 
    3. print (A>B)#OutputTrue 
    4. A={1,2,3,4,5} 
    5. B={1,2,3,4,5} 
    6. print (A>B)#OutputFalse 
    7. A={1,2,3} 
    8. B={1,2,3,4,5} 
    9. print (A>B)#OutputTrue 

    总结

    Frozenset不支持所有更新方法,frozenset类型不可变且不可哈希创建,一旦创建内容无法更改。由于所有更新方法都修改了原始集,所以frozenset不支持它。

    我们可以通过两种方式执行数学集合设置操作:使用运算符或使用一种方法。其不同之处在于,如果使用方法,将接受iterable作为参数。但是对于运算符,仅应设置参数。如果不是,则会引发 TypeError。所有更新方法都会更新原始集,frozenset不支持该更新。除了更新方法外,所有其他方法都返回一个新集合。

    【编辑推荐】

    1. 聊聊 Python 数据处理全家桶(MongoDB 篇)
    2. 几行Python代码实现文字识别,你敢信?
    3. 使用 Python 读取 QQ 消息
    4. 0基础学Python有多难?该怎么入门?
    5. 进阶Python,从编写Python函数开始

    上一篇:C++从零基础教程之运算符重载,掌握四点助你掌握运算符重载

    下一篇:浅谈Kotlin的Checked Exception机制