Python 集合 set 定义、操作与去重应用详解

Ivy
Ivy
发布时间:2026-10-14| 3人浏览过
原创

本文详解Python中set集合的定义方式、常用增删方法(add、remove、discard、pop)、统计与遍历操作,以及差集、并集、交集和异或运算。重点介绍利用set进行列表去重的场景,包括保持类型不变和保持原始顺序的实现方案,帮助开发者高效处理无序不重复数据。

引言

尽管set(集合)在日常编码中使用频率不如列表或字典,但它作为一种无序且元素不重复的序列结构,在快速实现数据去重方面具有显著优势。

集合的定义

set(集合)与列表在语法上有一定相似性,但核心区别在于集合内的元素必须唯一。创建集合时,可以使用花括号 {} 包裹并用逗号 , 分隔元素,或者直接调用 set() 构造函数。

{ } 定义


#!/usr/bin/python3
# -*- coding:utf-8 -*-
name_set = {'hui', 'wang', 'zack', 'hui'}
print(name_set)    	# 结果为 {'hui', 'wang', 'zack'}
name_set = set('hui', 'wang', 'zack', 'hui')

set() 定义

需要注意的是,set() 构造函数仅接受一个可迭代对象作为参数。


In [13]: name_set = set('hui')
In [14]: name_set
Out[14]: {'h', 'i', 'u'}
In [15]: name_set = set(['hui', 'wang', 'zack', 'hui'])
In [16]: name_set
Out[16]: {'hui', 'wang', 'zack'}

特别提示:不能通过 s = {} 来创建空集合,因为这种写法默认生成的是字典类型。若要创建空集合,必须使用 s = set()。


In [27]: s = {}
In [28]: s1 = set()
In [29]: type(s)
Out[29]: dict
In [30]: type(s1)
Out[30]: set

集合常用操作

以下是集合支持的所有内置方法列表。

由于内置方法众多,这里选取几个高频使用的方法进行实际测试演示。

集合添加元素

只需调用 add() 方法,即可向集合中追加新元素。


In [33]: s = set()
In [34]: s.add(1)
In [35]: s.add(4)
In [36]: s.add(3)
In [37]: s
Out[37]: {1, 3, 4}
In [38]: s.add(2)
In [39]: s
Out[39]: {1, 2, 3, 4}

集合移除元素

  • remove() 用于移除集合中的指定元素,若该元素不存在,程序将抛出错误。
  • discard() 用于移除集合中的指定元素,若该元素不存在,程序不会报错,静默处理。
  • pop() 用于随机移除集合中的一个元素。

In [38]: # remove() 移除
In [39]: s
Out[39]: {1, 2, 3, 4}
In [40]: s.remove(3)
In [41]: s
Out[41]: {1, 2, 4}
In [42]: s.remove(5)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-42-9ec04578636f> in <module>
----> 1 s.remove(5)
KeyError: 5

In [45]: # discard() 移除
In [46]: s
Out[46]: {1, 2, 4}
In [47]: s.discard(4)
In [48]: s
Out[48]: {1, 2}
In [49]: s.discard(3)
In [50]: s
Out[50]: {1, 2}

In [56]: # pop() 随机移除
In [57]: s.pop()
Out[57]: 1
In [58]: s
Out[58]: {2, 3, 9, 'hui'}
In [59]: s.pop()
Out[59]: 2
In [60]: s
Out[60]: {3, 9, 'hui'}

实际上,set 集合的 pop() 方法会移除并返回集合中“左侧”(即迭代顺序中的第一个)的元素。

集合统计、清空元素

  • 使用 len() 函数可以统计集合中元素的总个数。
  • 使用 clear() 方法可以清空集合内的所有元素,使其变为空集合。

In [68]: name_set
Out[68]: {'wang', 'zack'}
In [69]: len(name_set)
Out[69]: 2
In [71]: name_set.clear()
In [72]: len(name_set)
Out[72]: 0
In [73]: name_set
Out[73]: set()

集合元素获取(遍历)

由于集合是无序数据结构,不支持索引访问,也没有提供通过索引获取元素的方法,因此获取集合元素只能采用 for ... in ... 循环进行遍历。


In [81]: name_set
Out[81]: {'hui', 'wang', 'zack'}
In [82]: for name in name_set:
    ...:     print(name)
    ...:
hui
wang
zack
In [83]: name_set[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-83-c0ead6d21f1d> in <module>
----> 1 name_set[0]
TypeError: 'set' object is not subscriptable

集合之间的运算

集合差运算 -


In [89]: a = {1, 2, 3, 4, 5}
In [90]: b = {1, 2, 3, 6}
In [91]: a - b
Out[91]: {4, 5}
In [92]: b - a
Out[92]: {6}
In [93]: a.difference(b)
Out[93]: {4, 5}
In [94]: b.difference(a)
Out[94]: {6} 

表达式 a - b 表示从集合 a 中移除所有存在于集合 b 中的元素;同理,b - a 表示从 b 中移除 a 的元素。此外,a - b 等价于调用 a.difference(b) 方法。

集合并运算 |


In [95]: a
Out[95]: {1, 2, 3, 4, 5}
In [96]: b
Out[96]: {1, 2, 3, 6}
In [97]: a | b
Out[97]: {1, 2, 3, 4, 5, 6}

集合交运算 &


In [99]: a
Out[99]: {1, 2, 3, 4, 5}
In [100]: b
Out[100]: {1, 2, 3, 6}
In [101]: a & b
Out[101]: {1, 2, 3}

集合异或运算 ^


In [102]: a
Out[102]: {1, 2, 3, 4, 5}
In [103]: b
Out[103]: {1, 2, 3, 6}
In [104]: a ^ b
Out[104]: {4, 5, 6}

异或运算 ^ 的结果是移除 a 和 b 集合中共同拥有的元素后,剩余元素的并集。

应用场景

普通for循环去重


In [1]: li = [2, 1, 3, 6, 2, 1]
In [2]: temp = []
In [3]: for i in li:
   ...:     if i not in temp:
   ...:         temp.append(i)
   ...:
In [4]: li
Out[4]: [2, 1, 3, 6, 2, 1]
In [5]: temp
Out[5]: [2, 1, 3, 6]

利用集合简单去重


In [106]: li = [1, 2, 2, 3, 3, 5]
In [107]: li = set(li)
In [108]: li
Out[108]: {1, 2, 3, 5}
In [109]: type(li)
Out[109]: set
In [110]:

直接将列表转换为集合会导致数据类型变为 set,这通常不符合后续需要列表操作的需求,因此这不是理想结果。

若希望去重后保持列表类型,只需在转换时嵌套调用 list() 即可,例如 list(set(li))。


In [110]: li = [1, 2, 2, 3, 3, 5]
In [111]: li = list(set(li))
In [112]: li
Out[112]: [1, 2, 3, 5]
In [113]: type(li)
Out[113]: list
In [114]:

去重保持原来的顺序

使用 sort + set 去重


In [6]: list1 = [2, 1, 3, 6, 2, 1]
In [7]: list2 = list(set(list1))
In [8]: list2
Out[8]: [1, 2, 3, 6]
In [9]: list2.sort(key=list1.index)
In [10]: list2
Out[10]: [2, 1, 3, 6]

使用 sorted + set 去重


In [12]: list1 = [2, 1, 3, 6, 2, 1]
In [13]: temp = sorted(set(list1), key=list1.index)
In [14]: temp
Out[14]: [2, 1, 3, 6]

总结

本文到此结束,希望能为读者带来帮助,欢迎继续关注本站以获取更多技术内容!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。