在Python中,我们经常会遇到需要去除重复元素的情况,比如处理一份有重复记录的数据列表。这时候,集合(set) 就是一个非常实用的工具。它最显著的特点就是元素不重复,并且是无序的。通过集合,我们可以轻松实现数据去重,同时还能进行交集、并集等集合运算。
一、为什么用集合去重?¶
假设我们有一个列表 [1, 2, 2, 3, 3, 3],如果想去除重复元素,用列表实现可能需要写循环或者列表推导式(比如 list(set([1,2,2,3,3,3]))),而集合的去重更直接——一行代码就能搞定,而且逻辑更清晰。
二、创建集合(Set)¶
1. 直接用大括号 {} 创建¶
集合用大括号 {} 定义,元素之间用逗号分隔。但要注意:集合中的元素不能重复,重复的元素会自动被忽略。
# 定义一个包含重复元素的集合
my_set = {1, 2, 3, 2, 3}
print(my_set) # 输出:{1, 2, 3}(重复元素被自动去重)
2. 用 set() 函数创建¶
如果需要将其他可迭代对象(如列表、元组)转换为集合,用 set() 函数更方便。
# 从列表创建集合(自动去重)
my_list = [1, 2, 2, 3, 4]
my_set = set(my_list)
print(my_set) # 输出:{1, 2, 3, 4}
注意:空集合的创建¶
- 不能用
{}表示空集合,因为{}是空字典(后续会介绍字典)。 - 空集合必须用
set()创建:
empty_set = set()
print(empty_set) # 输出:set()
三、集合的常用操作¶
1. 基本操作:添加和删除元素¶
- 添加元素:用
add()方法添加单个元素。
my_set = {1, 2, 3}
my_set.add(4) # 添加元素4
print(my_set) # 输出:{1, 2, 3, 4}
- 删除元素:用
remove()或discard()方法。 remove(x):如果元素x不存在,会报错。discard(x):如果元素x不存在,不会报错(更安全)。
my_set = {1, 2, 3}
my_set.remove(2) # 删除元素2
print(my_set) # 输出:{1, 3}
my_set.discard(5) # 删除不存在的元素5,无报错
print(my_set) # 输出:{1, 3}
- 随机删除:用
pop()方法(集合无序,所以随机删除一个元素)。
my_set = {1, 2, 3}
removed = my_set.pop() # 随机删除一个元素(返回被删除的元素)
print(my_set) # 输出:{2, 3}(假设删除了1)
print(removed) # 输出:1(被删除的元素)
2. 集合运算(去重后的数据处理)¶
集合的核心功能之一是处理数据间的关系,比如交集、并集、差集。这些运算可以用符号或方法实现,以下是常见场景:
- 交集(Intersection):同时存在于两个集合中的元素。
- 符号:
&或方法intersection()
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 交集:{3, 4}
print(a & b) # 输出:{3, 4}
print(a.intersection(b)) # 输出:{3, 4}
- 并集(Union):两个集合中所有元素的合并(去重)。
- 符号:
|或方法union()
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 并集:{1, 2, 3, 4, 5, 6}
print(a | b) # 输出:{1, 2, 3, 4, 5, 6}
print(a.union(b)) # 输出:{1, 2, 3, 4, 5, 6}
- 差集(Difference):属于第一个集合但不属于第二个集合的元素。
- 符号:
-或方法difference()
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 差集:{1, 2}(a中有但b中没有的元素)
print(a - b) # 输出:{1, 2}
print(a.difference(b)) # 输出:{1, 2}
四、集合的特性(初学者必看)¶
- 无序性:集合不记录元素的插入顺序,因此无法通过索引访问元素(比如
my_set[0]会报错)。
my_set = {1, 2, 3}
print(my_set[0]) # 报错:TypeError: 'set' object is not subscriptable
- 元素不可变:集合中的元素必须是不可变类型(如数字、字符串、元组),不能包含列表、字典等可变类型。
invalid_set = {[1, 2], 3} # 报错:TypeError: unhashable type: 'list'
五、实战案例:列表去重¶
用集合实现列表去重非常简单,只需将列表转为集合,再转回列表即可:
# 原始列表(有重复元素)
my_list = [1, 2, 2, 3, 3, 3, 4]
# 集合去重 + 转回列表
unique_list = list(set(my_list))
print(unique_list) # 输出:[1, 2, 3, 4](注意:顺序可能随机,因为集合无序)
如果需要保持原顺序(Python 3.7+),可以结合列表推导式和集合去重:
seen = set()
unique_list = [x for x in my_list if not (x in seen or seen.add(x))]
print(unique_list) # 输出:[1, 2, 3, 4](保持原顺序)
总结¶
集合(set)是Python中处理无序、不重复数据的利器,尤其适合去重和集合运算。掌握以下关键点:
- 创建:用 {} 或 set(),注意空集合只能用 set()。
- 去重:直接 list(set(重复列表)) 一行搞定。
- 操作:添加(add())、删除(remove()/discard())、集合运算(交集&、并集|、差集-)。
- 特性:无序性(无法索引)、元素不可变(不能含列表)。
通过多练习例子,你很快就能熟练运用集合解决去重和数据处理问题!