中国南国集团 发表于 2024-4-13 13:05:50

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

前言

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

1. 字典拼接

这种方法比较低效,不过也科普下
不能直接对两个 字典对象使用 + 运算符,需要将 字典转换为列表,然后再进行合并
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 不会被修改
[*]一行代码中完成字典合并的简洁方式,适用于不修改原始字典的情况
[*]合并任意数量的字典
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 中,但不会创建新的字典
[*]原地修改原始字典的方式,适用于需要在原始字典上进行更新的情况
[*]只能用于将一个字典的内容更新到另一个字典中
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允许将多个字典链在一起,形成一个逻辑上的单一映射
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可以用于创建一个默认字典,可以方便地合并两个字典
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 += value

print(f"dict1:{dict1}")
print(f"dict2:{dict2}")
print(dict(merged_dict))# 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}截图如下:

不过这种合并,如果值同样的时候,不是强覆盖而是相加
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 += value

print(dict(merged_dict)) # 输出:{'a': 3, 'b': 2, 'd': 4}截图如下:


6. 彩蛋(不覆盖合并)

对于上述的字典遇到同样的键会强行覆盖,如果需要两个同样的键,但不同的value值
方法一:使用新的key值:
for key, value in tmp.items():
    if key not in res:
    # 此处不同键 则直接添加字典
      res = 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 = value# 使用带计数的新键存储值具体移除key值,可以通过如下方式:
if k.endswith('i'):# 如果键以 'i' 结尾
    new_k = k[:-1]# 移除 'i'方法二:转换为列表拼接:
or key, value in tmp.items():
    if key in res:
      if not isinstance(res, list):
            # 如果值不是列表,将其转换为列表
            res = ]
      res.append(value)# 追加新值到列表中
    else:
      res = value# 如果键不存在,直接添加键值对到字典中以上就是python实现字典合并的五种方法的详细内容,更多关于python字典合并的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/python/319227cz5.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: python实现字典合并的五种方法(附示例代码)