设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 92|回复: 12

python实现字典合并的五种方法(附示例代码)

[复制链接]

1

主题

62

回帖

148

积分

注册会员

积分
148
发表于 2024-4-19 20:17:22 | 显示全部楼层 |阅读模式
目录


前言

从项目中了解到这个函数:
  1. res = {**res, **tmp}
复制代码
,也知道是字典的合并,且遇到相同的键会进行覆盖而不是追加
对此详细了解Python字典合并的多个方法
由于字典的key是唯一的,对应如果出现一样的,会出现强覆盖,这一点需要明确

1. 字典拼接

这种方法比较低效,不过也科普下
不能直接对两个 字典对象使用 + 运算符,需要将 字典转换为列表,然后再进行合并
  1. dict1 = {'a': 1, 'b': 2}
  2. dict2 = {'c': 3, 'd': 4}

  3. merged_dict = dict(list(dict1.items()) + list(dict2.items()))

  4. print(f"dict1:{dict1}")
  5. print(f"dict2:{dict2}")
  6. print(merged_dict)  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
复制代码
截图如下:


2. {**dict1, **dict2}

字典解包操作符
  1. **
复制代码
,它将两个字典中的键值对解包并合并成一个新的字典

  • 返回一个新的合并后的字典,原始字典 dict1 和 dict2 不会被修改
  • 一行代码中完成字典合并的简洁方式,适用于不修改原始字典的情况
  • 合并任意数量的字典
  1. dict1 = {'a': 1, 'b': 2}
  2. dict2 = {'c': 3, 'd': 4}

  3. merged_dict = {**dict1, **dict2}
  4. print(f"dict1:{dict1}")
  5. print(f"dict2:{dict2}")
  6. print(merged_dict)  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
复制代码
截图如下:


3. dict.update()
  1. update()
复制代码
方法可以用来将一个字典的键值对添加到另一个字典中

  • 修改了原始字典 dict1,dict2 的键值对被添加到了 dict1 中,但不会创建新的字典
  • 原地修改原始字典的方式,适用于需要在原始字典上进行更新的情况
  • 只能用于将一个字典的内容更新到另一个字典中
  1. dict1 = {'a': 1, 'b': 2}
  2. dict2 = {'c': 3, 'd': 4}

  3. dict1.update(dict2)

  4. print(f"dict1:{dict1}")
  5. print(f"dict2:{dict2}")
复制代码
截图如下:


4. collections.ChainMap
  1. collections.ChainMap
复制代码
允许将多个字典链在一起,形成一个逻辑上的单一映射
  1. from collections import ChainMap

  2. dict1 = {'a': 1, 'b': 2}
  3. dict2 = {'c': 3, 'd': 4}

  4. merged_dict = ChainMap(dict1, dict2)
  5. print(f"dict1:{dict1}")
  6. print(f"dict2:{dict2}")
  7. print(dict(merged_dict))  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
复制代码
截图如下:


5. collections.defaultdict
  1. collections.defaultdict
复制代码
可以用于创建一个默认字典,可以方便地合并两个字典
  1. from collections import defaultdict

  2. dict1 = {'a': 1, 'b': 2}
  3. dict2 = {'c': 3, 'd': 4}

  4. merged_dict = defaultdict(int, dict1)
  5. for key, value in dict2.items():
  6.     merged_dict[key] += value

  7. print(f"dict1:{dict1}")
  8. print(f"dict2:{dict2}")
  9. print(dict(merged_dict))  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
复制代码
截图如下:

不过这种合并,如果值同样的时候,不是强覆盖而是相加
  1. from collections import defaultdict

  2. dict1 = {'a': 1, 'b': 2}
  3. dict2 = {'a': 2, 'd': 4}

  4. merged_dict = defaultdict(int, dict1)
  5. for key, value in dict2.items():
  6.     merged_dict[key] += value

  7. print(dict(merged_dict)) # 输出:  {'a': 3, 'b': 2, 'd': 4}
复制代码
截图如下:


6. 彩蛋(不覆盖合并)

对于上述的字典遇到同样的键会强行覆盖,如果需要两个同样的键,但不同的value值
方法一:使用新的key值
  1. for key, value in tmp.items():
  2.     if key not in res:
  3.     # 此处不同键 则直接添加字典
  4.         res[key] = value
  5.     else:
  6.     # 如果同键,则弄成一个新的key值,后续处理的时候,通过新旧key值的差异,在统一筛选过滤!
  7.         # 计算重复次数
  8.         count = 1
  9.         new_key = f"{key}{count}"
  10.         while new_key in res:
  11.             count += 1
  12.             new_key = f"{key}{count}i"
  13.         res[new_key] = value  # 使用带计数的新键存储值
复制代码
具体移除key值,可以通过如下方式:
  1. if k.endswith('i'):  # 如果键以 'i' 结尾
  2.     new_k = k[:-1]  # 移除 'i'
复制代码
方法二:转换为列表拼接
  1. or key, value in tmp.items():
  2.     if key in res:
  3.         if not isinstance(res[key], list):
  4.             # 如果值不是列表,将其转换为列表
  5.             res[key] = [res[key]]
  6.         res[key].append(value)  # 追加新值到列表中
  7.     else:
  8.         res[key] = value  # 如果键不存在,直接添加键值对到字典中
复制代码
以上就是python实现字典合并的五种方法的详细内容,更多关于python字典合并的资料请关注脚本之家其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

2

主题

47

回帖

118

积分

注册会员

积分
118
发表于 2024-6-19 07:12:29 | 显示全部楼层
说得太好了,完全同意!

0

主题

55

回帖

111

积分

注册会员

积分
111
发表于 2024-6-20 12:43:51 | 显示全部楼层
已测试,非常不错

1

主题

57

回帖

137

积分

注册会员

积分
137
发表于 2024-7-1 00:23:04 | 显示全部楼层
顶一个,观点非常中肯!

0

主题

29

回帖

59

积分

注册会员

积分
59
发表于 2024-7-6 22:01:26 | 显示全部楼层
嘎嘎嘎嘎嘎嘎嘎

1

主题

55

回帖

130

积分

注册会员

积分
130
发表于 2024-7-24 11:27:15 | 显示全部楼层
每日一回

0

主题

52

回帖

103

积分

注册会员

积分
103
发表于 2024-7-30 08:34:24 | 显示全部楼层
太棒了!感谢分享这个信息!

1

主题

62

回帖

148

积分

注册会员

积分
148
 楼主| 发表于 2024-9-1 10:12:34 | 显示全部楼层
你的信息来源是?我想了解更多。

1

主题

71

回帖

165

积分

注册会员

积分
165
发表于 2024-9-3 23:36:18 | 显示全部楼层
嘎嘎嘎嘎嘎嘎嘎

0

主题

62

回帖

121

积分

注册会员

积分
121
发表于 2024-9-11 23:53:24 | 显示全部楼层
谢谢你的提醒,我会注意的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 12:42 , Processed in 0.105918 second(s), 27 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表