📜  Python集合Set

📅  最后修改于: 2020-01-13 11:49:20             🧑  作者: Mango

在Python中,Set是可迭代,可变且没有重复元素的无序数据类型集合。集合中的元素顺序可能由各种元素组成。
与列表相比,使用集合的主要优点是它具有高度优化的方法来检查集合中是否包含特定元素。

创建一个集合

可以通过将内置set()函数与可迭代对象或序列一起使用来创建集合,方法是将序列放在花括号中,并用“逗号”分隔。
注:集合不能具有诸如列表、字典之类的可变元素作为其元素。

# Python程序,用来展示创建集合
# 创建一个集合
set1 = set()
print("创建一个空集合: ")
print(set1)
# 创建一个包含string的集合
set1 = set("芒果文档")
print("\n创建一个包含string的集合: ")
print(set1)
# 使用构造函数创建集合
String = '芒果文档'
set1 = set(String)
print("\n使用构造函数创建集合: " )
print(set1)
# 使用list创建集合
set1 = set(["芒果", "文档", "芒果"])
print("\n使用list创建集合: ")
print(set1)

输出:

创建一个空集合:
set()
创建一个包含string的集合:
{'文', '芒', '档', '果'}
使用构造函数创建集合:
{'文', '芒', '档', '果'}
使用list创建集合:
{'文档', '芒果'}

集合仅包含唯一元素,但是在集合创建时,也可以传递多个重复值。集合中元素的顺序是不确定的且不可更改。集合中元素的类型不必相同,各种混合数据类型值也可以传递给集合。

# 使用list创建集合
# (包含重复值)
set1 = set([1, 2, 4, 4, 3, 3, 3, 6, 5])
print("\n使用list创建集合: ")
print(set1)
# 使用混合数据类型创建集合
# (包含整数和字符串)
set1 = set([1, 2, '芒果', 4, '文档', 6, '芒果'])
print("\n使用混合数据类型创建集合 ")
print(set1)

输出:

使用list创建集合:
{1, 2, 3, 4, 5, 6}
使用混合数据类型创建集合
{1, 2, 4, '芒果', 6, '文档'}

将元素添加到集合

使用add()方法

可以使用内置add()函数将元素添加到Set中。使用add() 一次只能将一个元素添加到集合中,可以使用循环一次添加多个元素。
注:不能将列表作为元素添加到集合中,因为列表不可改变,不可哈希,而可以添加元组是因为元组是不可变的,因此是可哈希的。

# Python代码,展示集合中添加元素
# 创建一个集合
set1 = set()
print("初始化空集合: ")
print(set1)
# 添加元素和元组到集合中
set1.add(8)
set1.add(9)
set1.add((6,7))
print("\n添加元素和元组到集合中: ")
print(set1)
# 使用迭代器添加元素
for i in range(1, 6):
    set1.add(i)
print("\n使用迭代器添加元素: ")
print(set1)

输出:

初始化空集合:
set()
添加元素和元组到集合中:
{8, 9, (6, 7)}
使用迭代器添加元素:
{1, 2, 3, (6, 7), 4, 5, 8, 9}

使用update()方法

为了添加两个或多个元素,可以使用Update()。该update()方法接受列表,字符串,元组以及其他集合作为其参数。在所有这些情况下,都避免了重复元素。

# Python程序,展示如何在集合中添加元素
# 使用Update函数在集合中添加元素
set1 = set([ 4, 5, (6, 7)])
set1.update([10, 11])
print("\n使用Update函数在集合中添加元素 : ")
print(set1)

输出:

使用Update函数在集合中添加元素 :
{10, 11, 4, 5, (6, 7)}

访问集合

集合中的项不能通过引用索引来访问,因为集合是无序的,因此项没有索引。但是,您可以使用for循环遍历集合项,或者使用in关键字询问集合中是否存在指定值。

# Python代码,展示如何在集合中访问特定值
# 创建集合
set1 = set(["芒果", "文档", "芒果"])
print("\n初始化集合")
print(set1)
# 用for循环访问集合的元素
print("\n集合的元素: ")
for i in set1:
    print(i, end=" ")
# 使用in关键字检查集合元素
print("文档" in set1)

输出:

初始化集合:
{'芒果', '文档'}
集合的元素:
芒果 文档
True

从集合中删除元素

使用remove()方法或discard()方法

可以使用内置remove()函数从Set中删除元素,但是如果元素不存在于集合中,则会发生KeyError。要从没有KeyError的集合中删除元素,请使用discard(),如果元素在集合中不存在,则保持不变。

# Python程序,展示从集合中删除元素
# 创建一个集合
set1 = set([1, 2, 3, 4, 5, 6,
            7, 8, 9, 10, 11, 12])
print("创建一个集合: ")
print(set1)
# 使用Remove()方法,从集合中删除元素
set1.remove(5)
set1.remove(6)
print("\n使用Remove()方法,从集合中删除元素: ")
print(set1)
# 使用Discard()方法,从集合中删除元素
set1.discard(8)
set1.discard(9)
print("\n使用Discard()方法,从集合中删除元素: ")
print(set1)
# 使用迭代器从集合中删除元素
for i in range(1, 5):
    set1.remove(i)
print("\n使用迭代器从集合中删除元素: ")
print(set1)

输出:

创建一个集合:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
使用Remove()方法,从集合中删除元素:
{1, 2, 3, 4, 7, 8, 9, 10, 11, 12}
使用Discard()方法,从集合中删除元素:
{1, 2, 3, 4, 7, 10, 11, 12}
使用迭代器从集合中删除元素:
{7, 10, 11, 12}

使用pop()方法

Pop() 函数也可以用于从集合中删除并返回一个元素,但是它仅删除集合中的最后一个元素。
注:如果集合是无序的,则无法使用该pop()函数确定弹出哪个元素。

# Python程序,展示从集合中删除元素
# 创建一个集合
set1 = set([1, 2, 3, 4, 5, 6,
            7, 8, 9, 10, 11, 12])
print("初始化集合: ")
print(set1)
# 使用pop()删除集合元素
set1.pop()
print("\n使用pop()删除集合元素: ")
print(set1)

输出:

初始化集合:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
使用pop()删除集合元素::
{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

使用clear()方法

要从集合中删除所有元素,请使用clear()函数。

#Creating a set
set1 = set([1,2,3,4,5])
print("\n初始化集合: ")
print(set1)
# 使用clear()删除所有元素
set1.clear()
print("\n使用clear()删除所有元素: ")
print(set1)

输出:

初始化集合:
{1, 2, 3, 4, 5}
使用clear()删除所有元素:
set()

Python中的冻结集FrozenSet是不可变的对象。虽然可以随时修改集合的元素,但是冻结集合的元素在创建后保持不变。
如果未传递任何参数,则返回空的Frozenset。

# Python代码,展示如何使用FrozenSet
# 创建一个冻结集
String = ('芒', '果', '文', '档')
Fset1 = frozenset(String)
print("冻结集是: ")
print(Fset1)
# 打印空冻结集
print("\nEmpty FrozenSet: ")
print(frozenset())

集合的方法

函数 描述
add() 将元素添加到集合中
remove() 从集合中删除一个元素。如果该元素不存在于集合中,则引发KeyError
clear() 从集合中删除所有元素
copy() 返回集合的浅表副本
pop() 删除并返回一个任意set元素。如果集合为空,则引发KeyError
update() 用自身和他人的并集更新集合
union() 返回新集合中集合的并集
difference() 将两个或多个集合的差值作为新集合返回
Difference_update() 从该集合中删除另一个集合的所有元素
discard() 如果元素是成员,则从集合中删除它。(如果元素不在集合中,则不执行任何操作)
intersection() 返回两个集合的交集作为新集合
junction_update() 用自身和另一个的交集更新集合
isdisjoint() 如果两个集合的交点为空,则返回True
issubset() 如果另一个集合包含此集合,则返回True
issuperset() 如果此集合包含另一个集合,则返回True
symmetric_difference() 返回两个集合的对称差作为新集合
symmetric_difference_update() 用本身和另一个的对称差异更新一个集合