wp231957 发表于 2023-4-29 09:32:38

关于合并字典的问题

比如:
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: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 = ''

isdkz 发表于 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 = 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 =
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}


这个函数首先找到所有字典中出现的键,然后为每个字典创建一个新的字典,用空字符串填充不存在的键。最后,将这些新字典添加到结果列表中。

wp231957 发表于 2023-4-29 09:36:36

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

太迅速了,我刚发完贴啊   再一刷页面over了   

歌者文明清理员 发表于 2023-4-29 09:37:14

wp231957 发表于 2023-4-29 09:36
太迅速了,我刚发完贴啊   再一刷页面over了

他是chatgpt,专业于将简单的问题复杂化

isdkz 发表于 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 =
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}


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

wp231957 发表于 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': ''}

isdkz 发表于 2023-4-29 09:38:42

wp231957 发表于 2023-4-29 09:36
太迅速了,我刚发完贴啊   再一刷页面over了

GPT速度{:5_97:}

isdkz 发表于 2023-4-29 09:41:00

wp231957 发表于 2023-4-29 09:38
我结果咋和你的不一致

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


这个代码用了个集合,顺序有点随机

isdkz 发表于 2023-4-29 09:43:42

wp231957 发表于 2023-4-29 09:38
我结果咋和你的不一致

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


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

dict_list =
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}


现在的代码将保持键的原始顺序。请注意,虽然代码更简洁,但可读性可能会受到一定影响。所以在实际应用中,请根据您的需求和团队的编码风格来选择合适的方法。

wp231957 发表于 2023-4-29 09:47:55

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

收到

歌者文明清理员 发表于 2023-4-29 09:56:47

wp231957 发表于 2023-4-29 09:47
收到

最佳答案{:10_258:}{:10_244:}{:10_324:}
页: [1]
查看完整版本: 关于合并字典的问题