数据类型-----集合

一、集合

1.定义:由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key;
集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值。

2.特性:
  • 不用元素组成,且元素不重复
  • 无序
  • 元素不可变(数字、字符串、元组)

   3.基本格式:

 

s = {1,2,3,4,'age'}
print(s)              ##输出s
print(type(s))        ##输出s的格式

输出:
{1, 2, 3, 4, 'age'}
<class 'set'>

 

 

   4.集合的去重功能

s = {1,2,3,3,3,3,3,3,3,3,3}
print(s)      ##重复的元素只输出一次

输出:
{1, 2, 3}    

   

  5.字符串转集合

s = set('hello')     ##使用for循环,并自动去重,且输出无序
print(s)

输出:
{'l', 'o', 'e', 'h'}

 

二、集合的内置方法

  • 添加元素
s = {1,2,'age'}
s.add('1')     ##由于这里添加的1是字符串类型,所有不会去重
print(s)

输出:
{1, 2, '1', 'age'}

 

  • 清空元素
s = {1,2,'age'}
s.clear()
print(s)     ##输出空的集合

输出:
set()

 

  • 复制集合
s = {1,2,'age'}
l = s.copy()
print(l)

输出:
{'age', 1, 2}

 

  • 删除
s.pop()             ##随机删除一个集合中的元素
s.remove('sb')      ##删除指定的元素,但是当被删除的元素不存在时会报错
s.discard('sbbb')   ##删除指定的元素,当被删除的元素不存在时不会报错

 

三、集合的关系运算

1.求交集

例: 存在两个列表,python_l = [ 'lcg' , 'szw' , 'zjw' ]         linux_l =  [ 'lcg' , 'szw' , 'sb' ] ,找出两个列表中共同存在的元素

方法一:使用列表的方法和in方法、for循环

 

python_l = [ 'lcg' , 'szw' , 'zjw' ]
linux_l =  [ 'lcg' , 'szw' , 'sb' ]
python_and_linux_l = []
for p_name in python_l:
    if p_name in linux_l:
        python_and_linux_l.append(p_name)
print(python_and_linux_l)             ##输出为一个列表

输出:
['lcg', 'szw']

 

 

方法二:使用集合的方法

 

 

python_l=['lcg','szw','zjw','lcg']
linux_l=['lcg','szw','sb']
p_s=set(python_l)                ##将两个列表转换为集合
l_s=set(linux_l)
#求交集
print(p_s,l_s)                   ##分别输出两个集合
print(p_s.intersection(l_s))     ##输出两个集合的交集
print(p_s&l_s)                   ##输出两个集合的交集(同上),输出为一个集合

输出:
{'szw', 'zjw', 'lcg'} {'szw', 'sb', 'lcg'}
{'szw', 'lcg'}
{'szw', 'lcg'}

 

 

 

2.求并集

python_l=['lcg','szw','zjw','lcg']
linux_l=['lcg','szw','sb']
p_s=set(python_l)
l_s=set(linux_l)
print(p_s.union(l_s))     ##union和|的效果相同
print(p_s|l_s)

输出:
{'szw', 'lcg', 'zjw', 'sb'}
{'szw', 'lcg', 'zjw', 'sb'}

 

3.求差集

python_l=['lcg','szw','zjw','lcg']
linux_l=['lcg','szw','sb']
p_s=set(python_l)
l_s=set(linux_l)
print('差集',p_s-l_s)             ##求p_s中有而l_s中没有的元素
print(p_s.difference(l_s))       ##同上
print('差集',l_s-p_s)             ##求l_s中有而p_s中没有的元素
print(l_s.difference(p_s))       ##同上

输出:
差集 {'zjw'}
{'zjw'}
差集 {'sb'}
{'sb'}

 

4.交叉补集

python_l=['lcg','szw','zjw','lcg']
linux_l=['lcg','szw','sb']
p_s=set(python_l)
l_s=set(linux_l)
print('交叉补集',p_s.symmetric_difference(l_s))
print(p_s^l_s)

输出:
交叉补集 {'zjw', 'sb'}
{'zjw', 'sb'}

 

5.求差集并将结果重新赋值给p_s

python_l=['lcg','szw','zjw','lcg']
linux_l=['lcg','szw','sb']
p_s=set(python_l)
l_s=set(linux_l)

print(p_s,l_s)
print('差集',p_s-l_s)
print(p_s)
p_s.difference_update(l_s)     ##相当于p_s=p_s-l_s
print(p_s)

输出:
{'lcg', 'zjw', 'szw'} {'lcg', 'szw', 'sb'}
差集 {'zjw'}
{'lcg', 'zjw', 'szw'}
{'zjw'}

 

四、集合的内置函数

1.判断两个集合是否有交集

s1 = {1,2}
s2 = {3,5}
s3 = {2,6}
print(s1.isdisjoint(s2))    ##不存在交集输出True
print(s1.isdisjoint(s3))    ##存在交集输出False

输出结果:

2.判断一个集合是否是另一个集合的子集

s1 = {1,2}
s2 = {3,5}
s3 = {2}
print(s2.issubset(s1))      ##判断的时候是利用for循环将集合中的元素逐个取出再进行比较
print(s3.issubset(s1))

输出结果:

3.判断一个集合是否是另一个集合的父集

s1 = {1,2}
s2 = {3,5}
s3 = {2}
print(s1.issuperset(s2))
print(s1.issuperset(s3))

输出结果:

 

4.对集合进行更新

s1 = {1,2,'lee','123ds'}
s2 = {3,5}
print(s1.union(s2))     ##只是求并集,并没有对s1重新赋值
print(s1)
s1.update(s2)
print(s1.update(s2))    ##对s1进行了重新赋值,与 s1 = s1.union(s2) 效果相同
print(s1)

输出结果:

 

五、补充 

1.定义不可变集合(普通集合可以增加or删除元素)

s1 = frozenset('hello')   ##只能通过将可迭代对象转换为不可变集合
s2 = frozenset(['hello',1,2,'12s'])
print(s1)     ##生成的不可变集合和普通的格式也不同,会在集合外加上frozenset()
print(s2)

输出结果:

 

2.可迭代对象去重的快捷方法—>将可迭代对象转换为集合后再转换回来

li = [1,2,3,'1w','1w',1,2]     ##集合不能使用索引但是可以使用for循环进行遍历
l =list(set(li))
print(l)

输出:

 

posted @ 2018-11-20 21:45  Forever_lee  阅读(390)  评论(0编辑  收藏  举报