在Python算法竞赛中,集合(set)和 字典(dict)是两个高频使用的内置数据结构,二者分工明确:集合专注于去重、集合运算 ,字典专注于键值映射、元素计数。本文整理了这两个数据结构的核心语法、竞赛常用写法,直接套用即可快速解决对应场景的题目。
一、集合(set):去重专用神器
集合的核心特性:元素无序、不可重复 ,是算法竞赛中实现快速去重的最优选择。
1. 核心基础语法
⚠️ 关键注意点:
- 空集合必须用
set()定义,{}默认是空字典! - 非空集合可直接写
{元素1, 元素2}
python
# 1. 定义空集合
s = set()
# s = {} ❌ 错误:这是空字典,不是集合
# 2. 添加元素:add()
s.add('hello')
s.add('world')
s.add('hello') # 重复添加,自动去重,无效果
print(s) # 输出:{'hello', 'world'}(无序,顺序可能变化)
# 3. 删除元素:remove()
s.remove('hello')
print(s) # 输出:{'world'}
# 4. 成员判断:in(时间复杂度O(1),比列表快!)
print('world' in s) # 输出:True
print('hello' in s) # 输出:False
2. 竞赛常用集合运算
处理多集合的交、并、差、对称差集,是字符串/数组去重、匹配类题目的常用操作:
python
a = {1, 2, 3}
b = {3, 4, 5}
# 并集:两个集合所有元素(去重)
print(a.union(b)) # {1,2,3,4,5}
# 交集:两个集合共有的元素
print(a.intersection(b)) # {3}
# 差集:a中有、b中没有的元素
print(a.difference(b)) # {1,2}
# 对称差:只在其中一个集合出现,不同时出现的元素(并集-交集)
print(a.symmetric_difference(b)) # {1,2,4,5}
# 对称差运算符(极简写法,竞赛推荐)
print(a ^ b) # 效果同上,输出 {1,2,4,5}
# 同样 | & - 也可以
二、字典(dict):映射/计数利器
字典是键值对(key-value)结构,核心作用:建立唯一键到值的映射,算法竞赛中最常用于元素频次统计(字符计数、数字计数)。
1. 竞赛标准写法:快速输入+元素计数
算法竞赛中常用 sys.stdin 加速输入,字典统计元素频率是必考场景,提供基础写法 和极简写法两种方案:
python
import sys
# 竞赛加速输入:替代input(),读取更快
input = lambda: sys.stdin.readline().strip()
# 读取输入字符串
s = input()
# 1. 定义空字典
d = dict() # 等价于 d = {}
# 2. 方案1:基础写法(if判断键是否存在)
for i in s:
# 键不存在:初始化值为1
if i not in d:
d[i] = 1
# 键存在:值+1
else:
d[i] += 1
# 方案2:极简写法(get()方法,推荐!)
# dict.get(key, default):key存在返回值,不存在返回默认值0
# for i in s:
# d[i] = d.get(i, 0) + 1
# 3. 遍历字典:键值对、键、值
print("=== 键值对遍历 ===")
for key, value in d.items():
print(f'{key}:{value}')
print("=== 所有键 ===")
print(d.keys()) # 输出所有key
print("=== 所有值 ===")
print(d.values()) # 输出所有value
示例运行
输入:abcabc
输出:
=== 键值对 ===
a:2
b:2
c:2
=== 所有键 ===
dict_keys(['a', 'b', 'c'])
=== 所有值 ===
dict_values([2, 2, 2])
三、核心总结
-
集合(set)
- 用途:去重、成员判断、集合交并差/对称差运算
- 定义:空集合
set(),非空{x,y,z} - 核心方法:
add()、remove()、in - 对称差:
symmetric_difference()/^,找两个集合的独有元素
-
字典(dict)
- 用途:键值映射、元素频次统计
- 竞赛神器:
dict.get(key, 0) + 1一行实现计数 - 遍历:
items()(键值对)、keys()(键)、values()(值)
这两个数据结构是Python算法竞赛的基础工具,熟练掌握写法,能大幅提升编码效率!
总结
- 集合是去重专属 ,空集合必须用
set(),{}是字典; - 字典是映射/计数专属 ,
get()方法是竞赛计数的最优极简写法; - 对称差
^用于找两个集合互不重叠的元素,竞赛高频使用; - 二者的成员判断(
in)时间复杂度均为 O(1),远优于列表,竞赛中优先使用。