创建集合
集合(set)是一个无序不可重复的元素序列。
创建集合可以使用 {}
或 set()
函数,但是创建空集合只能使用set()
,因为 {}
用来创建字典。
# 创建有数据的集合
set1 = {1, 2, 3, 4, 5, 6}
print(set1) # {1, 2, 3, 4, 5, 6}
# 集合中的数据不能重复
set2 = {1, 2, 3, 4, 3, 5, 5}
print(set2) # {1, 2, 3, 4, 5}
# 使用set函数创建集合
set3 = set("helloworld")
print(set3) # {'h', 'w', 'r', 'e', 'o', 'd', 'l'}
# 创建空集合
set4 = set()
print(set4) # set()
print(type(set4)) # <class 'set'>
set1 = {"a", "b", "c", "d"}
# 因为集合是无序的,所以不能通过下标获取和修改元素
set1[2]
set1[0] = "aa"
注: 集合是可变数据类型。
集合中的元素要求
集合中的元素必须是可以hash的值。可以hash的数据类型包括:int、bool、str、tuple,所以集合中的数据类型只能是这几种,而list、set、dict是不可hash的。
print(hash("abc")) # 1414493781617976884
# TypeError: unhashable type: 'list'
print(hash([1, 2, 3]))
注:由于True和False本质上是1和0,所以存在如下情况:
set1 = {True, 1}
print(set1) # {True}
set2 = {1, True}
print(set2) # {1}
集合相关的操作
&
取两个集合的交集
set1 = {1, 2, 3, 4}
set2 = {2, 4, 6, 8}
print(set1 & set2) # {2, 4}
|
取两个集合的并集
set1 = {1, 2, 3, 4}
set2 = {2, 4, 6, 8}
print(set1 | set2) # {1, 2, 3, 4, 6, 8}
-
取两个集合的差集
set1 = {1, 2, 3, 4}
set2 = {2, 4, 6, 8}
# set1中有且set2中没有的值
print(set1 - set2) # {1, 3}
# set2中有且set1中没有的值
print(set2 - set1) # {8, 6}
in
判断数据是否在集合中。
set1 = {1, 2, 3, 4, 5}
print(3 in set1) # True
print(6 in set1) # False
not in
判断数据是否不在集合中。
set1 = {1, 2, 3, 4, 5}
print(3 not in set1) # False
print(6 not in set1) # True
集合常见的方法
add()
向集合中添加元素。
set1 = {1, 2, 3}
set1.add(4)
print(set1) # {1, 2, 3, 4}
# 集合可以去重,重复添加的数据最终只会有一个
set1.add(4)
print(set1) # {1, 2, 3, 4}
不能添加数据序列,会报TypeError:
set1.add([10, 20, 30]) # TypeError: unhashable type: 'list'
update()
向集合中添加另一个可迭代集合。
set1 = {1, 2, 3}
set1.update([4, 5, 6])
print(set1) # {1, 2, 3, 4, 5, 6}
不能添加单个元素,会报TypeError:
set1 = {1, 2, 3}
set1.update(10) # TypeError: 'int' object is not iterable
remove()
删除集合中指定数据,如果数据不存在会报错。
set1 = {1, 2, 3, 4, 5}
set1.remove(1)
print(set1) # {2, 3, 4, 5}
# 当删除不存在的数据,会报KeyError
set1.remove(6) # KeyError: 6
discard()
删除集合中的指定数据,如果数据不存在不报错。
set1 = {1, 2, 3, 4, 5}
set1.discard(6)
print(set1) # {1, 2, 3, 4, 5}
pop()
随机删除集合中某个数据,并返回这个数据。
set1 = {1, 2, 3, 4, 5}
set2 = set1.pop()
print(set2) # 1
print(set1) # {2, 3, 4, 5}
intersection()
取两个集合的交集,和操作符 &
一样。
set1 = {1, 2, 3, 4}
set2 = {2, 4, 6, 8}
print(set1.intersection(set2)) # {2, 4}
union()
取两个集合的并集,和操作符 |
一样
set1 = {1, 2, 3, 4}
set2 = {2, 4, 6, 8}
print(set1.union(set2)) # {1, 2, 3, 4, 6, 8}
difference()
取两个集合的差集,和操作符 -
一样
set1 = {1, 2, 3, 4}
set2 = {2, 4, 6, 8}
# set1中有且set2中没有的值
print(set1.difference(set2)) # {1, 3}
# set2中有且set1中没有的值
print(set2.difference(set1)) # {8, 6}
集合推导式
类似于列表推导式,集合也支持推导式形式
list1 = [1, 2, 3, 2, 4, 5]
set1 = {i ** 2 for i in list1}
print(set1) # {1, 4, 9, 16, 25}