Python基础教程2f–数据类型-set(集合)

原文链接: http://www.juzicode.com/archives/337

1 set的定义

dict,list,tuple的定义方法把大中小括号用完了,创建一个空的set就只能用set()了:

>>> s = set()
>>> type(s)
<class ‘set’>

当然还有一种创建包含了元素的set,仍然可以使用大括号{}来初始化,这时候解释器会根据{} 内部的组织形式自动推导为set还是dict。

>>> s={1:10,2:20,3:30} 
>>> type(s)
<class ‘dict’> #逗号分隔的是一组冒号隔开的数据,所以解释器推导为字典。
>>> s={1,2,3}
>>> type(s)
<class ‘set’>#逗号分隔的是单个的数据,所以解释器推导为集合

2 set的元素类型

直接上代码实验:

>>> s = {1,2,3}
>>> print(s)
{1, 2, 3} 
>>> s = {1.1, 2.2 ,3.3}
>>> print(s)
{1.1, 2.2, 3.3} 

>>> s = {‘juzicode’,’桔子code’}
>>> print(s)
{‘桔子code’, ‘juzicode’} 

>>> s = {(1,2,3),(4,5,6)}
>>> print(s)
{(1, 2, 3), (4, 5, 6)}

 >>> s ={[1,2,3],[4,5,6]}
Traceback (most recent call last):  File “<stdin>”, line 1, in <module>
TypeError: unhashable type: ‘list’

 >>> s = { {‘a’:1,’b’:2}  }
Traceback (most recent call last):  File “<stdin>”, line 1, in <module>
TypeError: unhashable type: ‘dict’ 

从实验结果看,set的元素类型不能是list和dict,因为他们是unhashable类型的数据,这和字典的key类型的要求是一样的。

【实验】定义一个set a,将这个a作为一个元素放到set b中,看下是什么结果?

计算长度len(s)

计算长度和str,list,tuple,dict一样,使用len()计算set的长度:

>>> s={1,2,3}
>>> len(s)3

添加/删除元素

s.add(x):往set中增加x元素,如果x已经存在,set不会发生变化,如果x不存在,set元素增加x;

s.remove(x):删除set中x元素,如果x不存在,则抛异常;

s.pop():随机删除一个元素,注意括号中是没有数据的。

s1.update(s2):s2的元素拆成单个后往s1中添加,类似list的extend()

源码print(‘—–欢迎来到www.juzicode.com’)
print(‘—–公众号: juzicode/桔子code\n’)
print(‘set实验:添加删除元素’)
s={1,2,3}
print(‘初始s: ‘,s) 
s.add(1)
print(‘add(1)后的set: ‘,s)
s.add(4)
print(‘add(4)后的set: ‘,s) 

s.remove(1)
print(‘remove(1)后的set: ‘,s)
#s.remove(5)
#print(‘remove(5)后的set: ‘,s) 

s.pop()print(‘pop()后的set: ‘,s)
s.pop()print(‘pop()后的set: ‘,s) 

s.update({7,8,9})
print(‘update(7,8,9)后的set: ‘,s)
结果—–欢迎来到www.juzicode.com
—–公众号: juzicode/桔子code 
set实验:添加删除元素初始
s:  {1, 2, 3} 
add(1)后的set:  {1, 2, 3}
add(4)后的set:  {1, 2, 3, 4} 
remove(1)后的set:  {2, 3, 4} 
pop()后的set:  {3, 4}
pop()后的set:  {4} 
update(7,8,9)后的set:  {4, 7, 8, 9}

并集/差集/交集

既然是集合,就会存在求并集、差集和交集的操作:

s1.difference(s2):计算s1有s2没有的元素;

s1.union(s2):计算s1和s2的并集,如果有元素重叠,只保留一个元素;

s1.intersection(s2):计算s1和s2的交集;

s1.symmetric_difference(s2):计算s1和s2的对称差集,对称差集就是2个集合的并集减交集;

源码s1={1,2,3,4,5}
s2={4,5,6}
print(‘初始s1: ‘,s1)
print(‘初始s2: ‘,s2) 
sd = s1.difference(s2)
print(‘s1和s2的差集: ‘,sd) 

su = s1.union(s2)
print(‘s1和s2的并集: ‘,su) 

si = s1.intersection(s2)
print(‘s1和s2的交集: ‘,si)

ssd = s1.symmetric_difference(s2)
print(‘s1和s2的对称差集: ‘,ssd)
结果初始s1:  {1, 2, 3, 4, 5}
初始s2:  {4, 5, 6}
s1和s2的差集:  {1, 2, 3}
s1和s2的并集:  {1, 2, 3, 4, 5, 6} #重复元素只保留同一个
s1和s2的交集:  {4, 5}

计算差、并、交、对称差集还可以使用符号来完成,上面例程中利用符号计算的结果是:

源码print(‘s1-s2: ‘,s1-s2)   #差集  
print(‘s1|s2: ‘, s1|s2)    #并集   
print(‘s1&s2: ‘, s1&s2)  #交集  
print(‘s1^s2: ‘, s1^s2)   #对称差集
结果s1-s2:  {1, 2, 3}
s1|s2: {1, 2, 3, 4, 5, 6}
s1&s2: {4, 5}
s1^s2 : {1, 2, 3, 6}

计算并集是不是也可以用加号,答案却是否定的,set不支持用加号进行求并集操作。

    print(‘s1+s2: ‘,s1+s2)
TypeError: unsupported operand type(s) for +: ‘set’ and ‘set’

判断

s1.isdisjoint(s2):s1和s2的元素是否都不相同,如果不相同返回True;

s1.issubset(s2):s1是否是s2的子集

s1.issubset(s2):s1是否是s2的超集

源码s1={1,2,3}
s2={1,2,3,4,5,6}
print(‘初始s1: ‘,s1)
print(‘初始s2: ‘,s2) 

print(‘s1和s2元素都不一样: ‘,s1.isdisjoint(s2))
print(‘s1是否是s2的子集: ‘,s1.issubset(s2))
print(‘s1是否是s2的超集: ‘,s1.issuperset(s2))
结果—–欢迎来到www.juzicode.com—–公众号: juzicode/桔子code
初始s1:  {1, 2, 3}
初始s2:  {1, 2, 3, 4, 5, 6} 
s1和s2元素都不一样:  False
s1是否是s2的子集:  True
s1是否是s2的超集:  False

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注