我们来讲一下最后一个比较有用的数据类型——集合
- 集合是一个无序的,元素不重复的序列
- 可以使用大括号{}或set()来标识
- 注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
例子:
my_set = {1, 2, 3, 4, 1, 2, 3, 4}
my_set_2 = my_set
print(my_set)
print(my_set_2)
结果为:
{1, 2, 3, 4}
{1, 2, 3, 4}
从上面的例子中,我们可以看出,虽然我们在创建集合的时候,是可以指定出带有重复元素的集合。
但是不管我们是直接打印,还是先赋值给别的变量再打印,我们最终的一个结果,一定是一个不带有重复元素的集合。
我们可以看到,集合使用了大括号,字典也是大括号。
区别在于,字典的元素是“键值对”,而集合的元素就是一个一个的数据类型。
集合:基本操作
- add添加元素
add()函数将元素添加到集合中,如果元素已存在,则不进行任何操作。
但是只能添加单个元素,不能添加其他数据类型,比如字典列表就会报错。
例子:
my_set = {1, 2, 3}
my_set.add(1)
print("添加元素1后的集合为:{}".format(my_set))
my_set.add(4)
print("添加元素1后的集合为:{}".format(my_set))
my_set.add({4})
结果为:
添加元素1后的集合为:{1, 2, 3}
添加元素1后的集合为:{1, 2, 3, 4}
Traceback (most recent call last):
File "C:/Users/xxx/PycharmProjects/untitled/Test/test.py", line 4, in
my_set.add({4})
TypeError: unhashable type: 'set'
- update添加元素
update()函数也可以添加元素,且参数可以是列表,元组,字典等
例子:
my_set = {1, 2, 3}
my_set.update({11})
print("添加元素后的集合为:{}".format(my_set))
my_set.update([11, 33])
print("添加元素后的集合为:{}".format(my_set))
my_set.update([1, 3123], {34, 4})
print("添加元素后的集合为:{}".format(my_set))
结果为:
添加元素后的集合为:{11, 1, 2, 3}
添加元素后的集合为:{1, 2, 3, 33, 11}
添加元素后的集合为:{1, 2, 3, 33, 34, 4, 11, 3123}
需要注意的是,不管要添加的类型是什么,都是将其中的元素直接添加到集合中,所以,如果集合中已经存在了相应的元素,就不会做什么操作,没有的话才会添加。
- remove删除元素
remove()函数将元素从集合中移除,如果元素不存在,则会发生错误
例子:
my_set = {1, 2, 3}
my_set.remove(1)
print("删除元素后的集合为:{}".format(my_set))
my_set.remove(4)
print("删除元素后的集合为:{}".format(my_set))
结果为:
删除元素后的集合为:{2, 3}
Traceback (most recent call last):
File "C:/Users/xxx/PycharmProjects/untitled/Test/test.py", line 4, in
my_set.remove(4)
KeyError: 4
- discard删除元素
discard()函数也可以用来删除元素,跟remove的区别在于,discard在删除不存在的元素时,不会报错。
例子:
my_set = {1, 2, 3}
my_set.discard(1)
print("删除元素后的集合为:{}".format(my_set))
my_set.discard(4)
print("删除元素后的集合为:{}".format(my_set))
结果为:
删除元素后的集合为:{2, 3}
删除元素后的集合为:{2, 3}
- pop随便删除元素
pop()函数用于随机删除集合中的一个元素。
例子:
my_set = {1, 2, 3, 4, 6}
my_set.pop()
print("删除元素后的集合为:{}".format(my_set))
my_set.pop()
print("删除元素后的集合为:{}".format(my_set))
结果为:
删除元素后的集合为:{2, 3, 4, 6}
删除元素后的集合为:{3, 4, 6}
- clear清空集合
clear()函数用于清空集合中的所有元素
例子:
my_set = {1, 2, 3, 4, 6}
my_set.clear()
print("清空元素后的集合为:{}".format(my_set))
结果为:
清空元素后的集合为:set()
- len计算集合元素个数
len()用于计算集合中元素的个数
例子:
my_set = {1, 2, 3, 4, 6}
print("集合中的元素个数为:{}".format(len(my_set)))
结果为:
集合中的元素个数为:5
- in成员判断
in用于判断元素是否存在于集合中
例子:
my_set = {1, 2, 3, 4, 6}
print(1 in my_set)
print({1, 2} in my_set)
print(7 in my_set)
结果为:
True
False
False
- copy()函数使用方法跟列表字典的copy也是一样的,因为集合也是可变类型
- difference差集
difference()函数返回包含在第一个集合中,但不包含在第二个集合中的元素
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
print(my_set_1.difference(my_set_2))
结果为:
{1, 2, 3}
- difference_update
difference_update() 函数用于移除两个集合中都存在的元素。
difference_update() 函数与 difference() 方法的区别在于 difference() 方法返回一个移除相同元素的新集合,而 difference_update() 方法是直接在原来的集合中移除元素,没有返回值。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
print(my_set_1.difference_update(my_set_2))
print(my_set_1)
结果为:
None
{1, 2, 3}
- intersection交集
intersection() 方法用于返回两个或更多集合中都包含的元素,即交集。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
my_set_3 = {4, 11, 22}
print(my_set_1.intersection(my_set_2,my_set_3))
结果为:
{4}
- intersection_update
intersection_update() 方法用于获取两个或更多集合中都重叠的元素,即计算交集。
intersection_update() 方法不同于 intersection() 方法,因为 intersection() 方法是返回一个新的集合,而 intersection_update() 方法是在原始的集合上移除不重叠的元素。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
my_set_3 = {4, 11, 22}
print(my_set_1.intersection_update(my_set_2,my_set_3))
print(my_set_1)
结果为:
None
{4}
- isdisjoint
isdisjoint() 方法用于判断两个集合是否包含相同的元素,如果没有相同的元素返回 True,否则返回 False。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
my_set_3 = {11, 22}
print(my_set_1.isdisjoint(my_set_2))
print(my_set_1.isdisjoint(my_set_3))
结果为:
False
True
- issubset
issubset() 方法用于判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False。
也就是判断当前集合是否为另一个集合的子集
例子:
my_set_1 = {1, 2, 3}
my_set_2 = {1, 2, 3, 4, 5, 6, 7, 8}
my_set_3 = {11, 22}
print(my_set_1.issubset(my_set_2))
print(my_set_1.issubset(my_set_3))
结果为:
True
False
- issuperset
issuperset() 方法用于判断指定集合的所有元素是否都包含在原始的集合中,如果是则返回 True,否则返回 False。
也就是判断另一个集合是否为当前集合的子集
例子:
my_set_1 = {1, 2, 3, 4, 5, 6, 7, 8}
my_set_2 = {1, 2, 3}
my_set_3 = {11, 22}
print(my_set_1.issuperset(my_set_2))
print(my_set_1.issuperset(my_set_3))
结果为:
True
False
- symmetric_difference
symmetric_difference() 方法返回两个集合中不重复的元素集合,即会移除两个集合中都存在的元素。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
my_set_3 = {11, 22}
print(my_set_1.symmetric_difference(my_set_2))
print(my_set_1.symmetric_difference(my_set_3))
结果为:
{1, 2, 3, 6, 7, 8}
{1, 2, 3, 4, 5, 11, 22}
- symmetric_difference_update
symmetric_difference_update() 方法移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
此函数没有返回值。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
my_set_3 = {11, 22}
print(my_set_1.symmetric_difference_update(my_set_2))
print(my_set_1)
print(my_set_1.symmetric_difference_update(my_set_3))
print(my_set_1)
结果为:
None
{1, 2, 3, 6, 7, 8}
None
{1, 2, 3, 6, 7, 8, 11, 22}
- union并集
union() 方法返回两个集合的并集,即包含了所有集合的元素,重复的元素只会出现一次。
例子:
my_set_1 = {1, 2, 3, 4, 5}
my_set_2 = {4, 5, 6, 7, 8}
my_set_3 = {11, 22}
print(my_set_1.union(my_set_2))
print(my_set_1.union(my_set_3))
结果为:
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 22, 11}
注:部分方案转自菜鸟教程