python中字典用法
在蓝桥杯Python组的竞赛中,字典(dict
) 是一种非常常用的数据结构,主要用于高效地存储和查找键值对。字典的常见用法包括统计频率、记录索引、优化查找等。以下是字典在蓝桥杯Python组中的常见用法总结:
1. 字典的基本操作
字典的核心特点是 键值对(key-value pair),键是唯一的,值可以重复。
创建字典
# 空字典
d = {}
# 带初始值的字典
d = {'a': 1, 'b': 2}
添加/修改元素
d['c'] = 3 # 添加键值对
d['a'] = 10 # 修改键 'a' 的值
访问元素
value = d['a'] # 获取键 'a' 的值
value = d.get('a', 0) # 如果键不存在,返回默认值 0
删除元素
del d['a'] # 删除键 'a'
d.pop('a') # 删除键 'a' 并返回其值
遍历字典
# 遍历键
for key in d:
print(key, d[key])
# 遍历键值对
for key, value in d.items():
print(key, value)
2. 字典的常见应用场景
(1)统计频率
字典常用于统计元素出现的次数。
示例:统计列表中每个元素的频率
nums = [1, 2, 2, 3, 3, 3]
freq = {}
for num in nums:
freq[num] = freq.get(num, 0) + 1
print(freq) # 输出: {1: 1, 2: 2, 3: 3}
(2)记录索引
字典可以用于记录元素的下标,方便快速查找。
示例:记录列表中每个元素的索引
nums = [10, 20, 30, 20]
index_map = {}
for i, num in enumerate(nums):
if num not in index_map:
index_map[num] = []
index_map[num].append(i)
print(index_map) # 输出: {10: [0], 20: [1, 3], 30: [2]}
(3)优化查找
字典的查找时间复杂度为 O(1),适合用于优化查找问题。
示例:两数之和
给定一个数组和一个目标值,找到数组中两个数的和等于目标值的索引。
def two_sum(nums, target):
num_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return [num_map[complement], i]
num_map[num] = i
return []
nums = [2, 7, 11, 15]
target = 9
print(two_sum(nums, target)) # 输出: [0, 1]
(4)前缀和与哈希表结合
字典常用于记录前缀和及其索引,解决子数组和问题。
示例:寻找和为 k 的最长子数组
def max_subarray_length(nums, k):
prefix_sum = {0: -1} # 初始化前缀和为 0 的索引为 -1
current_sum = 0
max_length = 0
for i, num in enumerate(nums):
current_sum += num
if current_sum - k in prefix_sum:
max_length = max(max_length, i - prefix_sum[current_sum - k])
if current_sum not in prefix_sum:
prefix_sum[current_sum] = i
return max_length
nums = [1, -1, 5, -2, 3]
k = 3
print(max_subarray_length(nums, k)) # 输出: 4
(5)去重
字典的键是唯一的,可以用于去重。
示例:列表去重
nums = [1, 2, 2, 3, 3, 3]
unique_nums = list(dict.fromkeys(nums))
print(unique_nums) # 输出: [1, 2, 3]
3. 字典的高级用法
(1)默认字典(defaultdict
)
defaultdict
是 collections
模块中的一个类,可以为字典设置默认值。
示例:统计字符频率
from collections import defaultdict
s = "hello"
freq = defaultdict(int)
for char in s:
freq[char] += 1
print(freq) # 输出: defaultdict(<class 'int'>, {'h': 1, 'e': 1, 'l': 2, 'o': 1})
(2)计数器(Counter
)
Counter
是 collections
模块中的一个类,专门用于统计频率。
示例:统计列表中元素的频率
from collections import Counter
nums = [1, 2, 2, 3, 3, 3]
freq = Counter(nums)
print(freq) # 输出: Counter({3: 3, 2: 2, 1: 1})
(3)有序字典(OrderedDict
)
OrderedDict
是 collections
模块中的一个类,可以保持字典的插入顺序。
示例:保持插入顺序
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d) # 输出: OrderedDict([('a', 1), ('b', 2), ('c', 3)])
4. 注意事项
- 字典的键必须是 不可变类型(如整数、字符串、元组)。
- 字典的查找和插入操作的时间复杂度是 O(1),但空间复杂度较高。
- 在蓝桥杯竞赛中,合理使用字典可以大幅优化代码性能。