鱼C论坛

 找回密码
 立即注册
查看: 2160|回复: 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 编辑

我们可以进一步简化代码,将整个操作放在一个列表推导中:
s1={"a":1,"b":2}
s2={"a":21,"c":3}
s3={"a":51,"b":22}
s4={"a":11,"d":4}
s5={"e":5}
dict_list = [s1, s2, s3, s4, s5]
merged_keys = {k for d in dict_list for k in d.keys()}
merged_dicts = [{key: d.get(key, '') for key in merged_keys} for d in dict_list]

for d in merged_dicts:
    print(d)

输出结果:
{'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
{'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
{'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
{'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
{'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}

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

使用道具 举报

发表于 2023-4-29 09:33:30 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-4-29 09:38 编辑
keys = []
for i in (s1, s2, s3, s4, s5):
    keys.extend(list(i))
for i in (s1, s2, s3, s4, s5):
    for key in keys:
        if key not in i:
            i[key] = ''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

    result = []
    for d in dict_list:
        new_dict = {}
        for key in merged_keys:
            new_dict[key] = d.get(key, '')
        result.append(new_dict)

    return result

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

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

for d in merged_dicts:
    print(d)

输出结果:
{'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
{'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
{'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
{'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
{'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}

这个函数首先找到所有字典中出现的键,然后为每个字典创建一个新的字典,用空字符串填充不存在的键。最后,将这些新字典添加到结果列表中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

太迅速了,我刚发完贴啊   再一刷页面  over了   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

他是chatgpt,专业于将简单的问题复杂化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我们可以进一步简化代码,将整个操作放在一个列表推导中:
s1={"a":1,"b":2}
s2={"a":21,"c":3}
s3={"a":51,"b":22}
s4={"a":11,"d":4}
s5={"e":5}
dict_list = [s1, s2, s3, s4, s5]
merged_keys = {k for d in dict_list for k in d.keys()}
merged_dicts = [{key: d.get(key, '') for key in merged_keys} for d in dict_list]

for d in merged_dicts:
    print(d)

输出结果:
{'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
{'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
{'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
{'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
{'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}

这种写法将整个操作放在一个列表推导中,省略了定义和调用函数的步骤。虽然代码更简洁,但可读性可能会受到一定影响。所以在实际应用中,请根据您的需求和团队的编码风格来选择合适的方法。
想知道小甲鱼最近在做啥?请访问 -> 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': ''}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

GPT速度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

这个代码用了个集合,顺序有点随机
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

for d in dict_list:
    for k in d.keys():
        if k not in merged_keys:
            merged_keys.append(k)

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

for d in merged_dicts:
    print(d)

输出结果:
{'a': 1, 'b': 2, 'c': '', 'd': '', 'e': ''}
{'a': 21, 'b': '', 'c': 3, 'd': '', 'e': ''}
{'a': 51, 'b': 22, 'c': '', 'd': '', 'e': ''}
{'a': 11, 'b': '', 'c': '', 'd': 4, 'e': ''}
{'a': '', 'b': '', 'c': '', 'd': '', 'e': 5}

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

使用道具 举报

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

收到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-29 09:56:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 17:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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