Loading

Python数据类型之集合类型

创建集合

集合(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}
posted @ 2021-04-28 21:37  charlatte  阅读(334)  评论(0编辑  收藏  举报