Python集合

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

创建一个集合

可以通过将内置set()函数与可迭代对象或序列一起使用来创建集合,方法是将序列放在大括号内,并用“逗号”分隔。

这段代码演示了如何在Python中创建集合,包括使用空集合、字符串、构造函数、列表、元组和字典来创建不同类型的集合。

# Python程序演示
# 在Python中创建集合

# 创建一个空集合
set1 = set()
print("初始空集合:")
print(set1)

# 使用字符串创建集合
set1 = set("JkhxwForGeeks")
print("\n使用字符串创建集合:")
print(set1)

# 使用构造函数创建集合
# (使用对象存储字符串)
String = 'JkhxwForGeeks'
set1 = set(String)
print("\n使用对象创建集合:")
print(set1)

# 使用列表创建集合
set1 = set(["Jkhxw", "For", "Geeks"])
print("\n使用列表创建集合:")
print(set1)

# 使用元组创建集合
t = ("Jkhxw", "for", "Geeks")
print("\n使用元组创建集合:")
print(set(t))

# 使用字典创建集合
d = {"Jkhxw": 1, "for": 2, "Geeks": 3}
print("\n使用字典创建集合:")
print(set(d))

输出:

初始空集合:
set()

使用字符串创建集合:
{'F', 'J', 'k', 'w', 'x', 'o', 'G', 's', 'r', 'e'}

使用对象创建集合:
{'F', 'J', 'k', 'w', 'x', 'o', 'G', 's', 'r', 'e'}

使用列表创建集合:
{'Geeks', 'Jkhxw', 'For'}

使用元组创建集合:
{'for', 'Jkhxw', 'Geeks'}

使用字典创建集合:
{'Geeks', 'for', 'Jkhxw'}

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

# 使用数字列表创建包含重复值的集合
set1 = set([1, 2, 4, 4, 3, 3, 3, 6, 5])
print("\n使用数字创建的集合:")
print(set1)

# 使用混合类型的值(包括数字和字符串)创建集合
set1 = set([1, 2, 'Geeks', 4, 'For', 6, 'Geeks'])
print("\n使用混合值创建的集合:")
print(set1)

输出:

使用数字创建的集合:
{1, 2, 3, 4, 5, 6}

使用混合值创建的集合:
{1, 2, 4, 6, 'Geeks', 'For'}

使用另一种方法创建集合

# Another Method to create sets in Python3

# Set containing numbers
my_set = {1, 2, 3}

print(my_set)

输出:

{1,2,3}

将元素添加到集合中

使用 add() 方法

可以使用内置的add()函数将元素添加到 Set 中。使用 add() 方法一次只能添加一个元素到集合中,使用 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添加1到5的元素后的集合:")
print(set1)

输出:

初始空集合:
set()

添加三个元素后的集合:
{8, 9, (6, 7)}

添加1到5的元素后的集合:
{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添加元素后的集合:
{4, 5, (6, 7), 10, 11}

访问集合

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

# Python程序演示
# 访问集合中的元素

# 创建一个集合
set1 = set(["Jkhxw", "For", "Geeks."])
print("\n初始集合")
print(set1)

# 使用for循环访问元素
print("\n集合中的元素:")
for i in set1:
    print(i, end=" ")

# 使用in关键字检查元素
print("\n")
print("Geeks" in set1)

输出:

初始集合
{'Geeks.', 'For', 'Jkhxw'}

集合中的元素:
Geeks. For Jkhxw

False

从集合中删除元素

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

可以使用内置的remove()函数从集合中删除元素,但如果集合中不存在该元素,则会出现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删除两个元素后的集合: ")
print(set1)

# 使用discard()方法从集合中删除元素
set1.discard(8)
set1.discard(9)
print("\n丢弃两个元素后的集合: ")
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}

删除两个元素后的集合:
{1, 2, 3, 4, 7, 8, 9, 10, 11, 12}

丢弃两个元素后的集合:
{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弹出一个元素后的集合: ")
print(set1)

输出:

初始集合:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

弹出一个元素后的集合:
{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

使用clear()方法:

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

# 创建一个集合
set1 = set([1,2,3,4,5])
print("\n初始集合: ")
print(set1)

# 使用clear()方法从集合中删除所有元素
set1.clear()
print("\n清空所有元素后的集合: ")
print(set1)

输出:


初始集合:
{1, 2, 3, 4, 5}

清空所有元素后的集合:
set()

在 Python 中,frozenset 是一种不可变的集合类型。与普通的集合(set)不同,frozenset 一旦创建就不能更改,也就是说不能添加、删除或修改其中的元素。这使得 frozenset 成为一种不可变的集合,适合用于需要保持不可变性的情况。

# Python程序演示
# 不可变集合的工作原理

# 创建一个集合
String = ('G', 'e', 'e', 'k', 's', 'F', 'o', 'r')

Fset1 = frozenset(String)
print("不可变集合是:")
print(Fset1)

# 打印空的不可变集合
# 没有传递参数
print("\n空的不可变集合:")
print(frozenset())

输出:

不可变集合是:
frozenset({'s', 'e', 'G', 'k', 'o', 'r', 'F'})

空的不可变集合:
frozenset()

将对象类型转换为集合

# Python3中的对象类型转换为集合

# 将列表转换为集合
my_list = [1, 2, 3, 3, 4, 5, 5, 6, 2]
my_set = set(my_list)
print("将my_list转换为集合:", my_set)

# 将字符串转换为集合
my_str = "JkhxwforGeeks"
my_set1 = set(my_str)
print("将my_str转换为集合:", my_set1)

# 将字典转换为集合
my_dict = {1: "One", 2: "Two", 3: "Three"}
my_set2 = set(my_dict)
print("将my_dict转换为集合:", my_set2)

输出:

将my_list转换为集合: {1, 2, 3, 4, 5, 6}
将my_str转换为集合: {'f', 'w', 'e', 'r', 'G', 'x', 'h', 'J', 'o', 'k', 's'}
将my_dict转换为集合: {1, 2, 3}

优点:

  • 唯一元素:集合只能包含唯一元素,因此它们可用于从数据集合中删除重复项。
  • 快速成员资格测试:集针对快速成员资格测试进行了优化,因此它们可用于确定某个值是否在集合中。
  • 数学集合运算:集合支持数学集合运算,例如并集、交集和差集,这对于处理数据集非常有用。
  • 可变:集合是可变的,这意味着您可以在创建集合后添加或删除集合中的元素。

缺点:

  • 无序:集合是无序的,这意味着您不能依赖集合中数据的顺序。这可能会使按特定顺序访问或处理数据变得困难。
  • 功能有限:与列表相比,集合的功能有限,因为它们不支持诸如append()或pop()之类的方法。这可能会使修改或操作存储在集合中的数据变得更加困难。
  • 内存使用:集合比列表消耗更多内存,特别是对于小型数据集。这是因为集合中的每个元素都需要额外的内存来存储哈希值。
  • 不太常用:在 Python 中,集合比列表和字典更不常用,这意味着可用于使用它们的资源或库可能较少。这可能会使找到问题的解决方案或获得调试帮助变得更加困难。

总的来说,集合是 Python 中一种有用的数据结构,特别是对于删除重复项或快速成员资格测试。然而,它们缺乏排序和有限的功能也使得它们不如列表或字典通用,因此在决定在 Python 程序中使用哪种数据结构时,仔细考虑使用集合的优点和缺点非常重要。

Python set方法汇总

方法功能
add(element)向集合中添加一个元素
remove(element)从集合中移除指定元素,如果不存在则引发KeyError
clear()移除集合中的所有元素
copy()返回集合的浅拷贝(shallow copy)
pop()移除并返回集合中的任意元素,若集合为空则引发KeyError
update(other_set)使用自身和另一个集合的并集来更新集合
union(*sets)返回多个集合的并集,生成一个新的集合
difference(other_set)返回当前集合和另一个集合的差集,生成一个新的集合
difference_update(other_set)从当前集合中移除另一个集合的所有元素
discard(element)从集合中移除指定元素,如果不存在则不执行任何操作
intersection(other_set)返回当前集合和另一个集合的交集,生成一个新的集合
intersection_update(other_set)使用自身和另一个集合的交集来更新集合
isdisjoint(other_set)如果两个集合没有交集,则返回True
issubset(other_set)如果当前集合是另一个集合的子集,则返回True
issuperset(other_set)如果当前集合是另一个集合的超集,则返回True
symmetric_difference(other_set)返回当前集合和另一个集合的对称差集,生成一个新的集合
symmetric_difference_update(other_set)使用自身和另一个集合的对称差集来更新集合