前言
从项目中了解到这个函数:res = {**res, **tmp}
,也知道是字典的合并,且遇到相同的键会进行覆盖而不是追加
对此详细了解Python字典合并的多个方法
由于字典的key是唯一的,对应如果出现一样的,会出现强覆盖,这一点需要明确
1. 字典拼接
这种方法比较低效,不过也科普下
不能直接对两个 字典对象使用 + 运算符,需要将 字典转换为列表,然后再进行合并
1 2 3 4 5 6 7 8 | dict1 = { 'a' : 1 , 'b' : 2 } dict2 = { 'c' : 3 , 'd' : 4 } merged_dict = dict ( list (dict1.items()) + list (dict2.items())) print (f "dict1:{dict1}" ) print (f "dict2:{dict2}" ) print (merged_dict) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4} |
截图如下:
2. {**dict1, **dict2}
字典解包操作符**
,它将两个字典中的键值对解包并合并成一个新的字典
- 返回一个新的合并后的字典,原始字典 dict1 和 dict2 不会被修改
- 一行代码中完成字典合并的简洁方式,适用于不修改原始字典的情况
- 合并任意数量的字典
1 2 3 4 5 6 7 | dict1 = { 'a' : 1 , 'b' : 2 } dict2 = { 'c' : 3 , 'd' : 4 } merged_dict = { * * dict1, * * dict2} print (f "dict1:{dict1}" ) print (f "dict2:{dict2}" ) print (merged_dict) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4} |
截图如下:
3. dict.update()
update()
方法可以用来将一个字典的键值对添加到另一个字典中
- 修改了原始字典 dict1,dict2 的键值对被添加到了 dict1 中,但不会创建新的字典
- 原地修改原始字典的方式,适用于需要在原始字典上进行更新的情况
- 只能用于将一个字典的内容更新到另一个字典中
1 2 3 4 5 6 7 | dict1 = { 'a' : 1 , 'b' : 2 } dict2 = { 'c' : 3 , 'd' : 4 } dict1.update(dict2) print (f "dict1:{dict1}" ) print (f "dict2:{dict2}" ) |
截图如下:
4. collections.ChainMap
collections.ChainMap
允许将多个字典链在一起,形成一个逻辑上的单一映射
1 2 3 4 5 6 7 8 9 | from collections import ChainMap dict1 = { 'a' : 1 , 'b' : 2 } dict2 = { 'c' : 3 , 'd' : 4 } merged_dict = ChainMap(dict1, dict2) print (f "dict1:{dict1}" ) print (f "dict2:{dict2}" ) print ( dict (merged_dict)) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4} |
截图如下:
5. collections.defaultdict
collections.defaultdict
可以用于创建一个默认字典,可以方便地合并两个字典
1 2 3 4 5 6 7 8 9 10 11 12 | from collections import defaultdict dict1 = { 'a' : 1 , 'b' : 2 } dict2 = { 'c' : 3 , 'd' : 4 } merged_dict = defaultdict( int , dict1) for key, value in dict2.items(): merged_dict[key] + = value print (f "dict1:{dict1}" ) print (f "dict2:{dict2}" ) print ( dict (merged_dict)) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4} |
截图如下:
不过这种合并,如果值同样的时候,不是强覆盖而是相加
1 2 3 4 5 6 7 8 9 10 | from collections import defaultdict dict1 = { 'a' : 1 , 'b' : 2 } dict2 = { 'a' : 2 , 'd' : 4 } merged_dict = defaultdict( int , dict1) for key, value in dict2.items(): merged_dict[key] + = value print ( dict (merged_dict)) # 输出: {'a': 3, 'b': 2, 'd': 4} |
截图如下:
6. 彩蛋(不覆盖合并)
对于上述的字典遇到同样的键会强行覆盖,如果需要两个同样的键,但不同的value值
方法一:使用新的key值:
1 2 3 4 5 6 7 8 9 10 11 12 13 | for key, value in tmp.items(): if key not in res: # 此处不同键 则直接添加字典 res[key] = value else : # 如果同键,则弄成一个新的key值,后续处理的时候,通过新旧key值的差异,在统一筛选过滤! # 计算重复次数 count = 1 new_key = f "{key}{count}" while new_key in res: count + = 1 new_key = f "{key}{count}i" res[new_key] = value # 使用带计数的新键存储值 |
具体移除key值,可以通过如下方式:
1 2 | if k.endswith( 'i' ): # 如果键以 'i' 结尾 new_k = k[: - 1 ] # 移除 'i' |
方法二:转换为列表拼接:
1 2 3 4 5 6 7 8 | or key, value in tmp.items(): if key in res: if not isinstance (res[key], list ): # 如果值不是列表,将其转换为列表 res[key] = [res[key]] res[key].append(value) # 追加新值到列表中 else : res[key] = value # 如果键不存在,直接添加键值对到字典中 |
以上就是python实现字典合并的五种方法的详细内容,更多关于python字典合并的资料请关注IT俱乐部其它相关文章!