集合去重:Python集合(set)的创建与常用操作

在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}

四、集合的特性(初学者必看)

  1. 无序性:集合不记录元素的插入顺序,因此无法通过索引访问元素(比如 my_set[0] 会报错)。
   my_set = {1, 2, 3}
   print(my_set[0])  # 报错:TypeError: 'set' object is not subscriptable
  1. 元素不可变:集合中的元素必须是不可变类型(如数字、字符串、元组),不能包含列表、字典等可变类型。
   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())、集合运算(交集&、并集|、差集-)。
- 特性:无序性(无法索引)、元素不可变(不能含列表)。

通过多练习例子,你很快就能熟练运用集合解决去重和数据处理问题!

小夜