一、集合的基本操作

集合(Set)是一种Python基本数据类型,是一种无序、可变的数据类型,它是由唯一的、不可变的元素组成的。

集合使用大括号{}来表示,元素之间使用逗号,分隔。

集合中的元素具有唯一性,不能重复,它会自动去除重复的元素。

集合中的元素是无序的,不能通过索引访问。

集合的主要特点是元素的唯一性和无序性。由于集合中的元素不重复,所以可以用于去除列表或其他可迭代对象中的重复元素。

集合还支持一些常见的集合操作,例如并集、交集、差集和对称差集等。

集合在处理需要快速检查元素是否存在的场景中非常有用,因为集合使用了散列表(Hash Table)来实现,可以在平均时间复杂度为O(1)的时间内进行元素的查找。

1、创建集合

可以使用花括号{}和set函数来创建集合。

1. 使用花括号`{}`并提供元素来创建一个非空集合,示例如下:

my_set = {1, 2, 3, 4, 5}
print(my_set)  # 输出:{1, 2, 3, 4, 5}

需要注意的是,如果使用花括号{}来创建一个空的集合,会被解释为创建一个空的字典。要创建一个空的集合,应该使用set()函数:

2. 使用set()函数创建集合时,可以将一个可迭代对象(如列表、元组)作为参数传递给set()函数,该函数会将可迭代对象中的元素添加到集合中。示例如下:

my_set = set([1, 2, 3, 4, 5])
print(my_set)  # 输出:{1, 2, 3, 4, 5}

需要注意的是,set()函数创建的集合是无序的,不会保留元素的插入顺序。

2、向集合中添加元素

要向集合中添加元素,可以使用`add()`方法或`update()`方法。这两个方法都可以用于向集合中添加一个或多个元素。

1. 使用`add()`方法添加单个元素到集合中。

如果添加的元素已经存在于集合中,`add()`方法不会产生任何效果,集合保持不变。示例如下:

my_set = {1, 2, 3}
my_set.add(4)
print(my_set)  # 输出:{1, 2, 3, 4}

my_set.add(3)  # 添加已存在的元素,集合保持不变
print(my_set)  # 输出:{1, 2, 3, 4}

2. 使用`update()`方法可以向集合中添加多个元素。

可以提供一个可迭代对象(如列表、元组或集合)作为参数,`update()`方法会将可迭代对象中的元素添加到集合中。示例如下:

my_set = {1, 2, 3}
my_set.update([4, 5, 6])
print(my_set)  # 输出:{1, 2, 3, 4, 5, 6}

my_set.update({3, 4, 5})  # 添加已存在的元素,集合保持不变
print(my_set)  # 输出:{1, 2, 3, 4, 5, 6}

需要注意的是,添加方法会直接修改原始集合,而不是返回一个新的集合。

3、删除集合中的元素

要删除集合中的元素,可以使用`remove()`、`discard()`或`pop()`方法。这些方法都可以用于删除集合中的元素,但在使用时需要注意它们的行为略有不同。

1. `remove()`方法用于删除指定元素。

如果元素存在于集合中,它将被删除;如果元素不存在,`remove()`方法会引发`KeyError`异常。示例如下:

my_set = {1, 2, 3, 4, 5}
my_set.remove(3)
print(my_set)  # 输出:{1, 2, 4, 5}

my_set.remove(6)  # 引发 KeyError: 6

2.  `discard()`方法也用于删除指定元素。

与`remove()`方法不同的是,如果元素不存在于集合中,`discard()`方法不会引发任何异常,而是保持集合不变。示例如下:

my_set = {1, 2, 3, 4, 5}
my_set.discard(3)
print(my_set)  # 输出:{1, 2, 4, 5}

my_set.discard(6)  # 不引发异常,集合保持不变

3.  `pop()`方法用于删除集合中的任意一个元素并返回它。

由于集合是无序的,因此无法确定将删除哪个元素。如果集合为空,`pop()`方法会引发`KeyError`异常。示例如下:

my_set = {1, 2, 3, 4, 5}
popped_element = my_set.pop()
print(popped_element)  # 输出:随机一个元素,例如 1
print(my_set)  # 输出:删除了一个元素后的集合

empty_set = set()
empty_set.pop()  # 引发 KeyError: 'pop from an empty set'

需要注意的是,与添加方法类似,这些删除方法也会直接修改原始集合,而不是返回一个新的集合。

4、其它操作

集合还提供了一些其他常用的方法,包括`len()`、`in`操作符和`clear()`方法。

1. `len()`方法用于返回集合中元素的数量。示例如下:

my_set = {1, 2, 3, 4, 5}
print(len(my_set))  # 输出:5

2. `in`操作符可以用于检查集合中是否包含某个元素。

如果元素存在于集合中,返回`True`;否则返回`False`。示例如下:

my_set = {1, 2, 3, 4, 5}
print(3 in my_set)  # 输出:True
print(6 in my_set)  # 输出:False

3.  `clear()`方法用于清空集合,即删除集合中的所有元素,使其变为空集合。示例如下:

my_set = {1, 2, 3, 4, 5}
my_set.clear()
print(my_set)  # 输出:set()

二、集合的属性方法

可以使用dir(set)函数,打印输出集合set的所有属性和方法。

['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

根据每种方法的用途可以分为如下几类:

  • 增:add、update
  • 删:pop、remove、dicard、clear
  • 改:无(集合是无序的)
  • 查:无(集合是无序的)
  • 集合运算:union、intersection、difference
  • 其它:copy

1、向集合中添加元素(add、update)

1. `add()` 方法:用于向集合中添加单个元素。如果集合中已经存在相同的元素,则不会进行任何操作,因为集合中的元素必须是唯一的。

my_set = {1, 2, 3}
my_set.add(4)
print(my_set)    # 输出: {1, 2, 3, 4}

my_set.add(3)
print(my_set)    # 输出: {1, 2, 3, 4} (3已存在,不会重复添加)

请注意,`add()` 方法只接受单个元素作为参数。

2. `update()` 方法:用于向集合中添加多个元素,接受一个可迭代对象作为参数,例如列表、元组或集合。`update()` 方法会将可迭代对象中的元素逐个添加到集合中,并确保集合中的元素唯一。

my_set = {1, 2, 3}
my_set.update([3, 4, 5])
print(my_set)    # 输出: {1, 2, 3, 4, 5}

综上所述,使用 add() 方法可以添加单个元素,使用 update() 方法可以添加多个元素或其他集合。

2、删除集合中元素(pop、remove、dicard、clear)

1. `pop()` 方法:用于从集合中随机删除并返回一个元素。由于集合是无序的,因此无法确定要删除的具体元素,但它会返回被删除的元素。如果集合为空,`pop()` 方法会引发 `KeyError` 错误。

my_set = {1, 2, 3, 4, 5}
x = my_set.pop()
print(x)    # 输出:一个集合中的随机元素,例如:3
print(my_set)    # 输出:剩下的元素:{1, 2, 4, 5}

2. `remove()` 方法:用于从集合中删除指定的元素。如果元素存在于集合中,它将被删除;如果元素不存在于集合中,`remove()` 方法会引发 `KeyError` 错误。

my_set = {1, 2, 3, 4, 5}
my_set.remove(3)
print(my_set)    # 输出:{1, 2, 4, 5}

3. `discard()` 方法:用于从集合中删除指定的元素。如果元素存在于集合中,它将被删除;与 `remove()` 不同,`discard()` 不会在删除不存在的元素时引发错误。

my_set = {1, 2, 3, 4, 5}
my_set.discard(3)
print(my_set)    # 输出:{1, 2, 4, 5}

my_set.discard(6)
print(my_set)    # 输出:{1, 2, 4, 5} (删除了不存在的元素,不会引发错误)

4. `clear()` 方法:用于从集合中删除所有的元素,使集合变为空集。

my_set = {1, 2, 3, 4, 5}
my_set.clear()
print(my_set)    # 输出:set() 一个空集

请注意,以上方法都是原地修改集合对象,即修改集合本身,而不是创建一个新的集合。

 3、集合运算(union、intersection、difference、symmetric_difference)

1. 并集(Union):将两个集合中的所有元素合并到一个新的集合中,重复的元素只保留一个。可以使用`|`操作符或`union()`方法实现。

set1 = {1, 2, 3}
set2 = {3, 4, 5}

union_set = set1 | set2
# 或者
union_set = set1.union(set2)

print(union_set)    # 输出: {1, 2, 3, 4, 5}

2. 交集(Intersection):获取两个集合中共有的元素,即两个集合中都存在的元素。可以使用`&`操作符或`intersection()`方法实现。

set1 = {1, 2, 3}
set2 = {3, 4, 5}

intersection_set = set1 & set2
# 或者
intersection_set = set1.intersection(set2)

print(intersection_set)    # 输出: {3}

3. 差集(Difference):从第一个集合中删除和第二个集合中相同的元素,保留剩下的元素。可以使用`-`操作符或`difference()`方法实现。

set1 = {1, 2, 3}
set2 = {3, 4, 5}

difference_set = set1 - set2
# 或者
difference_set = set1.difference(set2)

print(difference_set)    # 输出: {1, 2}

4. 对称差(Symmetric Difference):获取两个集合中所有不重复的元素,即两个集合中独有的元素。可以使用`^`操作符或`symmetric_difference()`方法实现。

set1 = {1, 2, 3}
set2 = {3, 4, 5}

symmetric_difference_set = set1 ^ set2
# 或者
symmetric_difference_set = set1.symmetric_difference(set2)

print(symmetric_difference_set)    # 输出: {1, 2, 4, 5}

通过这些集合运算,可以对集合进行灵活的操作并得到想要的结果。注意,集合运算不会修改原有的集合,而是返回一个新的集合。


reference:

数据结构 | 集合 — Python 3.8.16 文档