python -- 集合set

python -- 集合set

集合是{}形式的表现,同字典的表现形式,只不过集合set是列表list的衍生。

集合是对列表的一种深层操作。集合的表示形式有点像字典。集合也是无序的。

集合是一个无序的,不重复的数据组合

name = ['AA', 'BB', 'CC', 'AA']
name2 = set(name)

# <class 'list'> ['AA', 'BB', 'CC', 'AA']
print(type(name), name)
# <class 'set'> {'AA', 'BB', 'CC'}
print(type(name2), name2)

new_set = {}

# <class 'dict'> {}
print(type(new_set), new_set)

如果不用集合的模块,就用列表,来判断两个列表中是否有重合项。就要按照以下步骤操作:

首先建立一个列表,再用for语句将逐个添加现有列表的内容,同时用if-elif语句判断添加的元素是否在新建列表中。

建立一个空集合

new_set = set([])

# <class 'set'> set()
print(type(new_set), new_set)

集合的操作

集合的关系测试

  • 交集 intersection 运算符: &
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([123,234,345])
# set.intersection() 求交集
# 如果两集合间没有交集,就会返回一个set()值
# {33, 22, 55}
print(set_1.intersection(set_2))
# {33, 22, 55}
print(set_1 & set_2)
# set()
print(set_3 & set_2)
  • 并集 union 运算符: |
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
# set.union() 求并集
# {33, 66, 11, 44, 77, 22, 55, 88}
print(set_1.union(set_2))  
# {33, 66, 11, 44, 77, 22, 55, 88}
print(set_1 | set_2)  
  • 差集 difference 运算符: -
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
# set.difference() 求差集,注意集合间的关系
# set_1有,set_2没有
# {11, 44}
print(set_1.difference(set_2))
# {11, 44}
print(set_1 - set_2)
print('\033[31;1m--------------------\033[0m')
# {88, 66, 77}
print(set_2 - set_1)
  • 对称差集 symmetric_difference 求并集,再去除交集部分 运算符: ^
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([22, 33, 55,])
# symmetric_difference 求并集,再去除交集部分,没有主次关系
# {66, 11, 44, 77, 88}
print(set_1.symmetric_difference(set_2))
# {66, 11, 44, 77, 88}
print(set_2.symmetric_difference(set_1))
# {11, 44}
print(set_1.symmetric_difference(set_3))
# set()
print(set_1.symmetric_difference(set_1))
# {66, 11, 44, 77, 88}
print(set_1 ^ set_2)
  • 子集 issubset
  • 父集 isupperset
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([22, 33, 55])
# set.issubset() 求是否是子集
# 集合自己就是自己的子集
# False
print(set_1.issubset(set_2))
# False
print(set_2.issubset(set_1))
# True
print(set_2.issubset(set_2))
# set_3是不是set_1的子集 ?
# True
print(set_3.issubset(set_1))
# False
print(set_1.issubset(set_3))
print('\033[31;1m--------------------\033[0m')
# set.issuperset() 求是否是父集
# 集合自己就是自己的父集
# False
print(set_1.issuperset(set_2))
# True
print(set_2.issuperset(set_2))
# set_1是不是set_3的父集 ?
# True
print(set_1.issuperset(set_3))
  • isdisjoint() 判断集合是否有交集,没有交集返回True,有交集返回False,没有主次关系
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([22, 33, 55])
set_4 = set([222, 333, 555])
# set.isdisjoint()判断集合是否有交集,没有交集返回True,有交集返回False,没有主次关系
# 集合本身间是有交集,所以会返回False
# False
print(set_1.isdisjoint(set_2))
# False
print(set_1.isdisjoint(set_1))
# False
print(set_1.isdisjoint(set_3))
# False
print(set_3.isdisjoint(set_1))
print('\033[31;1m--------------------\033[0m')
# True
print(set_1.isdisjoint(set_4))
# True
print(set_4.isdisjoint(set_1))

集合的操作

  • add 集合的增加,只能增加一个元素,增加的元素不能是集合类型,不能是列表类型。
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([111,222,333])
# add 集合的添加
# {33, 11, 44, 22, 55}
print(set_1)
set_1.add(555)
# {33, 11, 44, 555, 22, 55}
print(set_1)
# set.add无法添加一个类型为set,list的元素,只能是str,int
set_1.add(set_2)
# set.add只能添加一个元素
set_1.add(555, 666)
print('--------------------')
print(set_1)
  • update 注意set.update()的书写格式
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([111,222,333])
list_1 = ['aa', 'bb', 'cc',]
# update集合的添加,注意set.update()的书写格式
# {33, 11, 44, 22, 55}
print(set_1)
set_1.update([555])
# {33, 11, 44, 555, 22, 55}
print(set_1)
# set.update添加一个类型为set,list
set_1.update(set_2)
# set.update可以添加多个元素
set_1.update([777, 666])
print('--------------------')
# {33, 11, 44, 555, 333, 111, 22, 55, 666, 222}
print(set_1)
print('--------------------')
# update传入的list,是将列表的内容转换成元素进集合,而不是将list整个(包含格式)传入
set_1.update(list_1)
# {33, 'bb', 'cc', 11, 44, 555, 333, 111, 22, 55, 666, 'aa', 222}
print(set_1)
  • remove 删除集合中的元素
set_1 = set([11, 22, 33, 44, 55])
# set.remove(),删除集合中的一个元素,不能多个
# 如果元素不在集合中,会报错KeyError
# {33, 11, 44, 55}
set_1.remove(22)
print(set_1)
  • pop 随机删除一个元素,并且返回这个删除的元素,不能加参数
set_1 = set([11, 22, 33, 44, 55])
print(set_1)  # {33, 11, 44, 22, 55}
# set.pop(),随机删除集合中的一个元素,并且返回这个元素
a = set_1.pop()
# 33
print(a)
# {11, 44, 22, 55}
print(set_1)
  • discard 删除集合中指定的元素,如果元素不存在,什么不做。
set_1 = set([11, 22, 33, 44, 55])
# {33, 11, 44, 22, 55}
print(set_1)
# set.discard(),删除集合中指定的元素,如果元素不存在,什么不做。
set_1.discard('aa')
# {33, 11, 44, 22, 55}
print(set_1)
set_1.discard(11)
# {33, 44, 22, 55}
print(set_1)
  • copy
set_1 = set([11, 22, 33, 44, 55])
#set.copy() 浅复制
set_2 = set_1.copy()
# {33, 11, 44, 22, 55}
print(set_1)
# {33, 11, 44, 22, 55}
print(set_2)
  • len 查看集合的长度,即元素数量
set_1 = set([11, 22, 33, 44, 55])
# 查看集合的长度,与list,tuple,str,dict用法一样
# 5
print(len(set_1))
  • in
  • not in 方法同list,dict,str
set_1 = set([11, 22, 33, 44, 55])
# in   or   not in
# True
print(11 in set_1)
# False
print("11" in set_1)

写在后面

  • 集合具有去重的作用,把一个列表变成集合,就自动去重了。
  • 集合具有关系测试的功能,测试两组数据之前的交集,差集,并集等关系。
  • 集合求差集时,需要注意前后关系
  • 集合自己,是自己的子集
  • 集合的对称差集,先求并集,再去除交集部分
  • 集合的add,只能是一个str或一个int,不能是set,也不能是list
  • 集合的update,注意书写格式,set.update([str1,str2]),或set.update(set); set.update(list)
  • 集合的remove,只能一个str或一个int,同add
  • 集合的pop(),里面不能加参数,需要指定就用remove
  • 集合的discard,删除集合中指定的元素,如果元素不存在,什么不做。如果是删除元素的话,建议使用discard,而不用remove,除非特殊需要。
作用 代码 用法 备注
交集 intersection set1.intersection(set2); set1 & set2 求两个集合的交集
并集 union set1.union(set2); set1 I set2 求两个集合的并集
差集 difference set1.difference(set2); set1 -set2 求两个集合的差集,set1有,set2没有的
对称差集 symmetric_difference set1.symmetric_difference(set2); set1 ^ set2 先并集再去除交集部分
子集判断 issubset() set1.issubset(set2) True or False
父集判断 issuperset() set1.issupset(set2) True or False
未交集判断 isdisjoint() set1.isdisjoint(set2) True or False
增加 add set.add('str') 只能加一个str或int
增加 update set.update(['str1','str2']); set.update([set]);set.update([list]) 注意书写格式
删除 remove set.remove('str') 只能加一个str或int,如果没有找到,报错
删除 pop set.pop() 随机删除一个元素,并返回删除值
删除 discard set.discard('str') 定向删除,如没有找到,不报错
复制 copy set.copy() 浅copy
统计 len len(set) 统计集合的个数
在或不在 in not in 'str' in set; 'str' not in set True or False
posted @ 2017-06-23 13:40  gzz041  阅读(191)  评论(0)    收藏  举报