2024/12/7【哈希表】 LeetCode453 四数相加II ,知识点:defaultdict,lambda函数,dict的get函数

454. 四数相加 II - 力扣(LeetCode)

代码随想录 (programmercarl.com)

本题解题步骤:

  1. 首先定义 一个unordered_map(在python中为字典),key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 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)

参数说明

  1. key:要查找的键。
  2. 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

注意事项

  1. 如果键存在,get 方法始终返回键对应的值,而不会理会 default 参数。
  2. 当需要访问字典中的键且不确定键是否存在时,优先考虑使用 get 方法来避免异常。

2.defaultdict有get方法吗?

在Python中,defaultdictcollections 模块中的一个类,它是 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'})

总结

  • defaultdictget 方法与普通字典完全一致,只是查找键而不创建缺失键。
  • 如果希望触发 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 对象的定义,它具有以下功能和特点:


构造含义

  1. lambda: 0

    • 定义了一个匿名函数,当访问不存在的键时,这个函数会被调用并返回 0 作为默认值。
  2. {'a': 1, 'b': 2}

    • 初始化字典,包含键值对 'a': 1'b': 2
  3. 组合含义

    • 如果访问的键在初始化字典中存在,则返回对应的值。
    • 如果访问的键不存在,则调用 lambda: 0,返回 0 并将该键添加到字典中,其值为 0
  1. 动态扩展

    • 每次访问不存在的键时,defaultdict 会动态扩展字典内容,不需要手动处理缺失键的情况。
posted @ 2024-12-12 17:02  axuu  阅读(4)  评论(0编辑  收藏  举报