集合(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}