关键词#1.定义:无序不重复元素集, 基本功能包括关系测试和消除重复元素.

2.关键词:类似dict、只有key无value、常用于集合类数学运算、

3.创建

s=set()  #入参可以是list、tuple、str、甚至dict

示例:

>>> s=set([1,2,3])
>>> s
{1, 2, 3}
>>> s=set((1,2,3))
>>> s
{1, 2, 3}
>>> s=set('123')
>>> s
{'3', '2', '1'}
>>> s=set({'a':1,'b':2,'c':3})
>>> s
{'a', 'b', 'c'}
PS.
>>> s={} #此方法py默认建立dict,而不是set
>>> type(s)
<class 'dict'>

4.集合添加、删除

添加=两种常用方法,分别是add和update。

add

>>> s=set('abc')
>>> s
{'a', 'b', 'c'}
>>> s.add('python') #add方法:是把要传入的元素做为一个整个添加到集合中,入参限定每次一个
>>> s
{'python', 'a', 'b', 'c'}

update(1):拆分添加

>>> s=set('abc')
>>> s.update('python') #update方法:是把要传入的元素拆分,做为个体传入到集合中
>>> s
{'h', 'n', 'y', 't', 'b', 'o', 'p', 'a', 'c'}

update(2):合并set

>>> set_1={1,2}
>>> set_2={'a','b'}
>>> set_3={'python','c#'}
>>> set_1.update(set_2,set_3)
>>> set_1
{1, 2, 'b', 'python', 'c#', 'a'}

常见错误

>>> s=set([1,2,3])
>>> s
{1, 2, 3}
>>> s.add([4,5])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> #报错原因分析:在创建set时,入参可以是iterable,但创建完毕后,set内部元素的type是key,key不能是可变类型,如list,谨记!
>>> s=set('abc')
>>> s
{'a', 'b', 'c'}
>>> s.update('de')
>>> s
{'d', 'a', 'b', 'e', 'c'}
>>> s.update(('f','g'))
>>> s
{'a', 'g', 'e', 'd', 'b', 'f', 'c'}
>>> s.update([1,2,3])
>>> s #update入参规则同add,因为它会打散入参格式,所以只需审查入参最小单位=非可变 即可.
{'a', 'g', 1, 2, 3, 'e', 'd', 'b', 'f', 'c'}
>>> s.update([1,2,[4,5]]) #此处入参最小单位除int类1,2外还有一个[4,5]是list类型,所以报错.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#set、dict类内部结构使用hash算法,遇到不可用hash算法类型入参即报错(unhashable)如list.
list/tuple/dict类均试验通过,唯独str解释不了,待查
>>> s=set([1,2])
>>> s
{1, 2}
>>> s.update('3,a,[4,5]')
>>> s
{1, 2, 'a', '4', '5', '[', '3', ']', ','}
#貌似update对入参type是str时,将其内部一切视为元素并打散,把[、]、逗号都认成元素.而当入参type是list、tuple却不会。

删除=s.discard(),s.pop(),s.remove() #del不支持set

>>> s={'Python','Java','C','C++','JavaScript','C#','Ruby','PHP','Objective-C'}
>>> s.remove('Java')
>>> s.remove('hello') # remove() 入参不存在则报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
>>> s.discard('hello')      #discard()入参不存在也不报错
>>>
>>> s.pop()     #pop()禁入参,随机删除并返回元素
'Ruby'
>>> s
{'C#', 'C++', 'Objective-C', 'PHP', 'C', 'Python', 'JavaScript'}

s.clear()清空set

>>> s
{'C#', 'C++', 'Objective-C', 'PHP', 'C', 'Python', 'JavaScript'}
>>> s.clear()
>>> s
set()

copy、issubset等等set函数用help(set.xx)查询语法规则,用dir(set)查询函数

5.set作为数学应用的函数&操作符方法

1.测试单个元素在集合内是否存在: inornot in

>>> s={1,2,3,4,5,'a','b','m','n'}
>>> 1 in s
True
>>> 7 in s
False
>>> 'c' not in s
True

2.测试两个集合是否包含,子集操作:``issubset/issuperset

issubset=测试目标set是否包含于入参
>>> s1={2,3}
>>> s2={1,2,3,4,5}
>>> s1.issubset(s2)
True
>>> s2.issubset(s1)
False
issuperset=测试目标set是否包含入参
>>> s1={1,2,3,4,5}
>>> s2={2,3}
>>> s1.issuperset(s2)
True

3.合并两个set并返回其并集set: set.union()

>>> s1={1,2,3,4,5}
>>> s2={2,3,7}
>>> s1.union(s2)
{1, 2, 3, 4, 5, 7} #set为无序无重复集合,自动摒除重复元素
>>> s3=s1.union(s2)
>>> s3
{1, 2, 3, 4, 5, 7}
________________________________
操作符求并集:s1|s2
>>> s=s1|s2
>>> s
{1, 3, 4, 5, 6, 7}

4.交集intersection()

>>> s1={1,3,4,5,7}
>>> s2={3,4,6}
>>> s1.intersection(s2)
{3, 4}
______________________________
操作符求交集:s1&s2
>>> s1&s2
{3, 4}

5.其他:difference() 相当于'差集'运算符

>>> s1={1,2,3,4,5}
>>> s2={2,4,6,8}
>>> s1.difference(s2) #s1中异于s2的元素集合
{1, 3, 5}
______________________________
#difference()=s1-s2 (差集操作符):相当于s1中减去s1&s2
>>> s1-s2
{1, 5, 7}

symmetric_difference():对称差集

>>> s1={1,2,3,4,5}
>>> s2={2,4,6,8}
>>> s1.symmetric_difference(s2)
{1, 3, 5, 6, 8}
_____________________________
操作符:s1^s2 #对称差集,相当于s1|s2-s1&s2
>>> s1^s2
{1, 3, 5, 6, 8}
目标 函数 操作符 解释
x ⊆ y x.issubset(y)
x ⊇ y x.issuperset(y)
并集∪ x.union(y) x|y
交集∩ x.intersection(y) x&y
差集 x.difference(y) x-y x-x&y
对称差集 x.symmentric_difference(y) x^y x|y-x&y

6.set遍历

#基本遍历法同list
s={1, 2, 'd', 'a', '4', 'c', '5'}
for i in s:
print(i)
______________________________
#idx表示集合中元素i的索引
s={1, 2, 'd', 'a', '4', 'c', '5'}
for idx, i in enumerate(s):
print(idx,i)

7. frozenset([iterable]) 冻结集合(元素不可变)

#区别于set,frozenset无法用s={}创建
>>> frozenset(['a','b','c'])
frozenset({'a', 'b', 'c'})

PS.关于set的几个陷阱

1.数学应用时的左右数比较结果'格式'set | ^ & frozenset

#当左右set类型不一致,结果格式以‘左’为准
>>> s={1,2,3,4,5,6}
>>> f=frozenset([1,3,5])
>>> s|f
{1, 2, 3, 4, 5, 6}
>>> s&f
{1, 3, 5}
>>> s^f
{2, 4, 6} #几个运算符的结果全为set
#同样的运算过程,结果'格式'完全不同
>>> f|s
frozenset({1, 2, 3, 4, 5, 6})
>>> f&s
frozenset({1, 3, 5})
>>> f^s
frozenset({2, 4, 6})

最新文章

  1. How to Allow MySQL Client to Connect to Remote MySql
  2. PostgreSQL wiki
  3. [转载]新手入门:Spring的一些学习方法及意见
  4. 判断是否含有中文,包含返回true,不包含返回false
  5. Contoso 大学 - 8 – 实现继承
  6. hdu 2191 珍惜现在,感恩生活 多重背包入门题
  7. C#字符串颠倒输出
  8. linux命令之mv
  9. 私有构造函数(c# .NET)
  10. 对手机SD卡的一些操作
  11. .net core 读取配置文件
  12. Oracle中清除BIN$开头的垃圾表的解决办法
  13. OpenCv 2.4.9 (二) 核心函数
  14. Android ViewPager动画切换
  15. Carthage入门篇-安装和使用
  16. [Swift]LeetCode606. 根据二叉树创建字符串 | Construct String from Binary Tree
  17. 【转】git示意图
  18. 成为JAVA架构师必看书籍推荐
  19. BZOJ4268 : 小强的书架
  20. POJ3241 Object Clustering(最小生成树)题解

热门文章

  1. CI知识:GitLab
  2. Sping框架的IOC特性 悲观锁、乐观锁 Spring的AOP特性
  3. Codeforces Round #324 (Div. 2)D. Dima and Lisa 数学(素数)
  4. 恶意IP监控
  5. C++ 代码片段(积累)
  6. Bootstrap4 网格系统
  7. openstack horizon 学习(1) 总览
  8. 国产手机没有google services 和google play崩溃,判断google services是否存在
  9. 详解jQuery uploadify文件上传插件的使用方法
  10. 8 Range 对象