set 定义

列表的特性:

  • 可修改
  • 无序
  • 不重复

列表的创建:

​ 1.直接创建; s = {‘a', 1, 'c'}

​ 2.set() 创建一个空set; s = set()

​ 3.set(iterable)创建一个包含可迭代对象元素的set; set = {'abc'}

#直接创建
>>> s = {'a', 1, 2, 'b'}
>>> s
{1, 2, 'b', 'a'}
#使用set()创建一个空set
>>> s = set()
>>> s
set()
#创建一个包含可迭代对象元素的set
>>> s = set('abc')
>>> s
{'c', 'b', 'a'}

set的方法:

方法 说明
set.add(elem) 本地修改,增加一个元素
set.update(iterable) 本地修改,增加可迭代对象的元素
set.remove(elem) 本地修改,删除一个元素, 返回None,元素不存在则报错
set.discart(elem) 本地修改,删除一个元素,不论是否存在,返回None
set.pop() 本地修改,随机弹出一个元素,返回弹出的元素
set.clear() 本地修改
set.copy() 返回一个复制的新set
>>> s = set('abc')
>>> s
{'c', 'b', 'a'}
#增加一个元素
>>> s.add('de')
>>> s
{'c', 'de', 'b', 'a'}
#将可迭代对象的元素增加到元组中 与union效果相同
>>> s.update('def')
>>> s
{'e', 'f', 'b', 'd', 'de', 'a', 'c'}

#remove删除一个元素
>>> s.remove('a')
>>> s
{'e', 'f', 'b', 'd', 'de', 'c'}
#remove删除一个不存在的元素
>>> s.remove('ab')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'ab'

#remove删除一个元素
>>> s.discard('e')
>>> s
{'f', 'b', 'd', 'de', 'c'}

#remove删除一个不存在的元素
>>> s.discard('ab')
>>> s
{'f', 'b', 'd', 'de', 'c'}

#pop随机弹出一个元素,并返回该元素
>>> s.pop()
'f'

>>> s2= s.copy()
>>> s2
{'d', 'de', 'b', 'c'}
>>> s2.clear()
>>> s2
set()

set集合的判断

角色 说明 判断
元素存在 集合中是否有或者没有这个元素 x in set ; x not in set
子集 A是B的子集,说明A的所有元素在B中都存在 A.issubset (B)或者 A <= B
真子集 A是B的真子集,说明A的所有元素都在B中且B的元素个数比A多。 A < B
超集 A是B的超集,说明A中有B的所有元素 A.issuper(B)或者A >= B
真超集 A是B的真超集,说明A中有B的所有元素,且A的元素个数比B多 A > B
isdisjoin A中所有的元素都不在B中 A.isdisjoint(B)
#几个范例
>>> A = {1, 2, 3}
>>> 1 in A
True
>>> 4 in A
False
>>> 4 not in A
True

>>> A = {1,2,3,4}
>>> B = {1,2,3,4,5}
>>> A.issubset(B)
True
>>> A<B
True

>>> A = {1,2,3,4}
>>> B = {1,2,3,4}
>>> A.issubset(B)
True
>>> A<B
False
>>> A<=B
True

>>> A = {1 ,2, 3}
>>> B = {4, 5, 6}
>>> A.isdisjoint(B)
True

set运算

操作 说明 方法 运算符重载
并集-->返回新集合 A与B的并集,返回包含A与B所有元素的集合,是A和B的super集合 A.union(*others) A | B
并集-->本地修改 本地修改集合A为A与B的并集 A.update(*others) A |= B
交集-->返回新集合 返回A与B的共同元素的集合 A.intersection(others) A & B
交集-->本地修改 本地修改A集合为A与B交集, A.intersection_update(*others) A &= B
差集-->返回新集合 A的B差集,返回集合A中减去B的元素的集合 A.difference(*others) A - B
差集-->本地修改 本地修改A集合为A与B的差集 A.difference_update(*others) A -= B
对称差集-->返回新集合 返回一个包含只在A中和只在B中的元素的集合,又被称为补集 A.symmetric_difference(B) A ^ B
对称差集-->本地修改 本地修改A为A与B的相对差集 A.symmetric_difference(B) A ^= B

并集

>>> A = {1, 2, 3}
>>> B = {3, 4, 5}
>>> A.union(B)
set([1, 2, 3, 4, 5])

>>> A | B
set([1, 2, 3, 4, 5])

并集的运算符重载,必须为set,union是个迭代对象就可以

>>> C = (5,6)

>>> A | B | C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'set' and 'tuple'

>>> A.union(B,C)
set([1, 2, 3, 4, 5, 6])

并集的本地修改

>>> C = (5,6)
>>> A
set([1, 2, 3])
>>> A.update(B)
>>> A
set([1, 2, 3, 4, 5])

>>> A |= set(C)
>>> A
set([1, 2, 3, 4, 5, 6])

交集运算

>>> A = {1, 2, 3}
>>> B = {3, 4, 5}
>>> C = (5,6)
>>> A.intersection(B)
set([3])
>>> A.intersection(B,C)
set([])
>>> A & B
set([3])
>>> A & B & C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'set' and 'tuple'
>>> A & B & set(C)
set([])
>>> A.intersection_update(B)
>>> A
set([3])
>>> A &= set(C)
>>> A
set([])

差集运算

>>> A = {1, 2, 3}
>>> B = {3, 4, 5}
>>> C = (5,6)
>>> A.difference(B)
set([1, 2])
>>> A.difference(B,C)
set([1, 2])
>>> A -B -C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'set' and 'tuple'
>>> A - B - set(C)
set([1, 2])
>>> A.difference_update(B)
>>> A
set([1, 2])
>>> A -= set(C)
>>> A
set([1, 2])

相对差集(补集)

>>> A = {1, 2, 3}
>>> B = {3, 4, 5}
>>> C = (5,6)
>>> A.symmetric_difference(B)
set([1, 2, 4, 5])

>>> A ^ B
set([1, 2, 4, 5])
>>> A.symmetric_difference(C)
set([1, 2, 3, 5, 6])

>>> A.symmetric_difference_update(B)
>>> A
set([1, 2, 4, 5])
>>> A ^= set(C)
set([1, 2, 3, 5, 6])

随机推荐

  1. 在PostgreSQL中 pg_start_backup 做了什么?

    # 在PostgreSQL中 pg_start_backup 做了什么?HM 2019-07-30 ## pg_start_backup 做一个备份开始标记,还做了一些其他的操作,下面进行探寻. * ...

  2. 移动端、pc端通用点击复制

    点击复制 function copyArticle(event){ const range = document.createRange(); range.selectNode(document.ge ...

  3. JS基础_基本语法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 三、redis学习(jedis连接池)

    一.jedis连接池 二.jedis连接池+config配置文件 三.jedis连接池+config配置文件+util工具类 util类 public class JedisPoolUtils { / ...

  5. 关于redis的几件小事(九)redis的并发竞争问题

    1.什么是并发竞争 就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 2.怎么解决 采 ...

  6. springboot(二十二)-sharding-jdbc-读写分离

    前面我们使用sharding-jdbc配置了分库分表.sharding-jdbc还有个用法,就是实现读写分离. 什么时候需要或者可以使用读写分离? 当我们的项目所使用的数据库查询的访问量,访问频率,及 ...

  7. 帝国cms 通过tags给产品或者新闻进行分类

    1.增加TAGS分类 先找到栏目== >TAGS管理 == > 管理TAGS分类 == >增加分类 2.增加相关的tag标签,也要选好TAGS分类 3.增加自定义标签模板 具体怎么写 ...

  8. 小P的架构生活(下)

    小L强烈建议团队使用微服务,并极力推荐了前公司用的一套分布式事务解决方案. 小P经过反复思考查证并做了大量的尝试后,辨证地对微服务架构做了如下分析: 为什么要用微服务,微服务带来了哪些好处? 1.减少 ...

  9. String,到底创建了多少个对象?

      String str=new String("aaa"); <span style="font-size:14px;">String str=n ...

  10. Adaptive Synchronization of Dynamics on Evolving Complex Networks

    原文链接:https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.100.114101 发表在:PRL 2008 ------------- ...