2024/12/7【哈希表】 LeetCode453 四数相加II ,知识点:defaultdict,lambda函数,dict的get函数
本题解题步骤:
- 首先定义 一个unordered_map(在python中为字典),key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
- 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 最后返回统计值 count 就可以了
from collections import defaultdict class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: res_dict = defaultdict(int) for num1 in nums1: for num2 in nums2: res_dict[num1+num2] += 1 count = 0 for num3 in nums3: for num4 in nums4: target = -(num3+num4) if target in res_dict: count += res_dict[target] return count
知识点:
1. dict的get函数
在Python中,get
是字典(dict
)对象的一个方法,用于安全地获取指定键对应的值。如果键不存在于字典中,它不会抛出错误,而是返回一个默认值(默认值可自定义,默认为 None
)。
语法
dictionary.get(key, default=None)
参数说明
key
:要查找的键。default
(可选):如果键不存在,则返回的默认值。默认为None
。
返回值
- 如果
key
存在于字典中,返回对应的值。 - 如果
key
不存在,返回default
值(如果未提供default
,则返回None
)。
使用场景
get
方法的主要作用是避免在访问字典中不存在的键时抛出 KeyError
。
示例代码
1. 基本用法
my_dict = {'name': 'Alice', 'age': 25} # 键存在时返回对应值 print(my_dict.get('name')) # 输出: Alice # 键不存在时返回默认值 None print(my_dict.get('gender')) # 输出: None
2. 提供默认值
my_dict = {'name': 'Alice', 'age': 25} # 键不存在时返回指定默认值 print(my_dict.get('gender', 'Unknown')) # 输出: Unknown
3. 与直接索引对比
my_dict = {'name': 'Alice'} # 直接索引会抛出错误 # print(my_dict['age']) # KeyError: 'age' # 使用 get 避免错误 print(my_dict.get('age')) # 输出: None
注意事项
- 如果键存在,
get
方法始终返回键对应的值,而不会理会default
参数。 - 当需要访问字典中的键且不确定键是否存在时,优先考虑使用
get
方法来避免异常。
2.defaultdict有get方法吗?
在Python中,defaultdict
是 collections
模块中的一个类,它是 dict
的子类。因此,defaultdict
也继承了 dict
的所有方法,包括 get
方法。
defaultdict.get
方法的行为
- 与普通字典中的
get
方法一致:返回指定键的值,如果键不存在,返回提供的默认值(或默认返回None
)。 - 注意:与
defaultdict
的默认值行为无关。调用get
方法时,不会触发defaultdict
为缺失键生成默认值的机制。
示例代码
1. 使用 get
方法
from collections import defaultdict # 定义一个默认值为 0 的 defaultdict dd = defaultdict(lambda: 0, {'a': 1, 'b': 2}) # 存在的键 print(dd.get('a')) # 输出: 1 # 不存在的键,get 返回 None print(dd.get('c')) # 输出: None # 不存在的键,但使用默认值参数 print(dd.get('c', 'default_value')) # 输出: default_value
2. 直接访问键与使用 get
的区别
from collections import defaultdict dd = defaultdict(lambda: 'default', {'a': 1, 'b': 2}) # 使用直接访问键时,defaultdict 会生成默认值 print(dd['c']) # 输出: default print(dd) # 输出: defaultdict(<function <lambda>>, {'a': 1, 'b': 2, 'c': 'default'}) # 使用 get 方法时,defaultdict 不会生成新键 print(dd.get('d')) # 输出: None print(dd) # 输出: defaultdict(<function <lambda>>, {'a': 1, 'b': 2, 'c': 'default'})
总结
defaultdict
的get
方法与普通字典完全一致,只是查找键而不创建缺失键。- 如果希望触发
defaultdict
的默认值行为,应直接使用键访问(如dd[key]
)。
3.理解
defaultdict(lambda : 0)
在 Python 中,lambda
是一种创建匿名函数的方式,通常用于定义简单的、只有一个表达式的函数。
语法
lambda arguments: expression
arguments
:函数的参数(可以有多个,用逗号分隔)。expression
:返回值是计算后的表达式。
注意:
lambda
函数是一个表达式,而不是一个完整的函数定义,因此可以在一行内编写。- 它没有名字,所以被称为匿名函数。
在 defaultdict
中的用法
当使用 defaultdict(lambda: 0)
时:
lambda: 0
是一个匿名函数,它没有参数。- 每当
defaultdict
遇到一个不存在的键时,就会调用这个匿名函数,生成并返回默认值0
。
示例
from collections import defaultdict # 创建一个 defaultdict,其中不存在的键默认值为 0 dd = defaultdict(lambda: 0) # 尝试访问不存在的键 print(dd['a']) # 输出: 0,因为 lambda: 0 返回了默认值 # 为键赋值 dd['a'] += 1 print(dd['a']) # 输出: 1
理解 lambda: 0
的替代写法
lambda: 0
等价于以下普通函数:
def default_value(): return 0
然后使用:
from collections import defaultdict dd = defaultdict(default_value)
但 lambda
写法更简洁,常用于需要快速定义简单逻辑的场景。
更多 lambda
示例
1. 带参数的 lambda
# 一个简单的加法函数 add = lambda x, y: x + y print(add(3, 5)) # 输出: 8
2. 用于排序
# 按元组的第二个元素排序 data = [(1, 2), (3, 1), (5, 4)] sorted_data = sorted(data, key=lambda x: x[1]) print(sorted_data) # 输出: [(3, 1), (1, 2), (5, 4)]
3. 与 map
结合
# 使用 lambda 将列表中的元素平方 numbers = [1, 2, 3, 4] squared = map(lambda x: x**2, numbers) print(list(squared)) # 输出: [1, 4, 9, 16]
总结
lambda
是一种快捷方式,用于定义简单函数。在 defaultdict(lambda: 0)
中,lambda: 0
定义了一个返回值为 0
的匿名函数,用于为缺失的键提供默认值。
4.defaultdict(lambda: 0, {'a': 1, 'b': 2})怎么理解
defaultdict(lambda: 0, {'a': 1, 'b': 2})
是一个 defaultdict
对象的定义,它具有以下功能和特点:
构造含义
-
lambda: 0
:- 定义了一个匿名函数,当访问不存在的键时,这个函数会被调用并返回
0
作为默认值。
- 定义了一个匿名函数,当访问不存在的键时,这个函数会被调用并返回
-
{'a': 1, 'b': 2}
:- 初始化字典,包含键值对
'a': 1
和'b': 2
。
- 初始化字典,包含键值对
-
组合含义:
- 如果访问的键在初始化字典中存在,则返回对应的值。
- 如果访问的键不存在,则调用
lambda: 0
,返回0
并将该键添加到字典中,其值为0
。
-
动态扩展:
- 每次访问不存在的键时,
defaultdict
会动态扩展字典内容,不需要手动处理缺失键的情况。
- 每次访问不存在的键时,