鱼C论坛

 找回密码
 立即注册
查看: 2603|回复: 11

[已解决]关于合并字典的问题

[复制链接]
发表于 2023-4-29 09:32:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
比如:
s1={"a":1,"b":2}
s2={"a":21,"c":3}
s3={"a":51,"b":22}
s4={"a":11,"d":4}
s5={"e":5}

要求合并后,所有字典长度一致,none项用空补齐

s1={"a":1,"b":2,'c':"",'d':"","e":""}
s2={"a":21,"b":"","c":3,'d':"","e":""}
s3={"a":51,"b":22,"c":"",'d':"","e":""}
s4={"a":11,"b":"","c":"","d":4,"e":""}
s5={"a":"","b":"",'c':"",'d':"","e":5}
最佳答案
2023-4-29 09:38:05
本帖最后由 isdkz 于 2023-4-29 09:41 编辑

我们可以进一步简化代码,将整个操作放在一个列表推导中:

  1. s1={"a":1,"b":2}
  2. s2={"a":21,"c":3}
  3. s3={"a":51,"b":22}
  4. s4={"a":11,"d":4}
  5. s5={"e":5}
  6. dict_list = [s1, s2, s3, s4, s5]
  7. merged_keys = {k for d in dict_list for k in d.keys()}
  8. merged_dicts = [{key: d.get(key, '') for key in merged_keys} for d in dict_list]

  9. for d in merged_dicts:
  10.     print(d)
复制代码


输出结果:

  1. {'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
  2. {'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
  3. {'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
  4. {'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
  5. {'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}
复制代码


这种写法将整个操作放在一个列表推导中,省略了定义和调用函数的步骤。虽然代码更简洁,但可读性可能会受到一定影响。所以在实际应用中,请根据您的需求和团队的编码风格来选择合适的方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-29 09:33:30 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-4-29 09:38 编辑
  1. keys = []
  2. for i in (s1, s2, s3, s4, s5):
  3.     keys.extend(list(i))
  4. for i in (s1, s2, s3, s4, s5):
  5.     for key in keys:
  6.         if key not in i:
  7.             i[key] = ''
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 09:34:56 | 显示全部楼层
您可以使用以下方法合并这些字典。这里我们创建了一个函数  merge_dicts  来实现这个功能。这个函数接受一个字典列表作为输入,然后返回一个合并后的字典列表。

  1. def merge_dicts(dict_list):
  2.     merged_keys = set()
  3.     for d in dict_list:
  4.         merged_keys.update(d.keys())

  5.     result = []
  6.     for d in dict_list:
  7.         new_dict = {}
  8.         for key in merged_keys:
  9.             new_dict[key] = d.get(key, '')
  10.         result.append(new_dict)

  11.     return result

  12. s1 = {"a": 1, "b": 2}
  13. s2 = {"a": 21, "c": 3}
  14. s3 = {"a": 51, "b": 22}
  15. s4 = {"a": 11, "d": 4}
  16. s5 = {"e": 5}

  17. dict_list = [s1, s2, s3, s4, s5]
  18. merged_dicts = merge_dicts(dict_list)

  19. for d in merged_dicts:
  20.     print(d)
复制代码


输出结果:

  1. {'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
  2. {'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
  3. {'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
  4. {'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
  5. {'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}
复制代码


这个函数首先找到所有字典中出现的键,然后为每个字典创建一个新的字典,用空字符串填充不存在的键。最后,将这些新字典添加到结果列表中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 09:36:36 | 显示全部楼层
isdkz 发表于 2023-4-29 09:34
您可以使用以下方法合并这些字典。这里我们创建了一个函数  merge_dicts  来实现这个功能。这个函数接受一 ...

太迅速了,我刚发完贴啊   再一刷页面  over了   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 09:37:14 | 显示全部楼层
wp231957 发表于 2023-4-29 09:36
太迅速了,我刚发完贴啊   再一刷页面  over了

他是chatgpt,专业于将简单的问题复杂化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 09:38:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-4-29 09:41 编辑

我们可以进一步简化代码,将整个操作放在一个列表推导中:

  1. s1={"a":1,"b":2}
  2. s2={"a":21,"c":3}
  3. s3={"a":51,"b":22}
  4. s4={"a":11,"d":4}
  5. s5={"e":5}
  6. dict_list = [s1, s2, s3, s4, s5]
  7. merged_keys = {k for d in dict_list for k in d.keys()}
  8. merged_dicts = [{key: d.get(key, '') for key in merged_keys} for d in dict_list]

  9. for d in merged_dicts:
  10.     print(d)
复制代码


输出结果:

  1. {'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
  2. {'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
  3. {'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
  4. {'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
  5. {'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}
复制代码


这种写法将整个操作放在一个列表推导中,省略了定义和调用函数的步骤。虽然代码更简洁,但可读性可能会受到一定影响。所以在实际应用中,请根据您的需求和团队的编码风格来选择合适的方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 09:38:07 | 显示全部楼层
isdkz 发表于 2023-4-29 09:34
您可以使用以下方法合并这些字典。这里我们创建了一个函数  merge_dicts  来实现这个功能。这个函数接受一 ...

我结果咋和你的不一致

D:\wpp>D:/Python37/python.exe d:/wpp/test10.py
{'e': '', 'd': '', 'a': 1, 'b': 2, 'c': ''}  
{'e': '', 'd': '', 'a': 21, 'b': '', 'c': 3}
{'e': '', 'd': '', 'a': 51, 'b': 22, 'c': ''}
{'e': '', 'd': 4, 'a': 11, 'b': '', 'c': ''}
{'e': 5, 'd': '', 'a': '', 'b': '', 'c': ''}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 09:38:42 | 显示全部楼层
wp231957 发表于 2023-4-29 09:36
太迅速了,我刚发完贴啊   再一刷页面  over了

GPT速度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 09:41:00 | 显示全部楼层
wp231957 发表于 2023-4-29 09:38
我结果咋和你的不一致

D:\wpp>D:/Python37/python.exe d:/wpp/test10.py

这个代码用了个集合,顺序有点随机
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 09:43:42 | 显示全部楼层
wp231957 发表于 2023-4-29 09:38
我结果咋和你的不一致

D:\wpp>D:/Python37/python.exe d:/wpp/test10.py

为了保持原始顺序,我们可以使用列表来收集所有的键,同时检查每个新添加的键是否已经在列表中。这是一个修改后的简洁代码:

  1. dict_list = [s1, s2, s3, s4, s5]
  2. merged_keys = []

  3. for d in dict_list:
  4.     for k in d.keys():
  5.         if k not in merged_keys:
  6.             merged_keys.append(k)

  7. merged_dicts = [{key: d.get(key, '') for key in merged_keys} for d in dict_list]

  8. for d in merged_dicts:
  9.     print(d)
复制代码


输出结果:

  1. {'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
  2. {'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
  3. {'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
  4. {'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
  5. {'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}
复制代码


现在的代码将保持键的原始顺序。请注意,虽然代码更简洁,但可读性可能会受到一定影响。所以在实际应用中,请根据您的需求和团队的编码风格来选择合适的方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 09:47:55 | 显示全部楼层
isdkz 发表于 2023-4-29 09:43
为了保持原始顺序,我们可以使用列表来收集所有的键,同时检查每个新添加的键是否已经在列表中。这是一个 ...

收到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-29 09:56:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 22:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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