【问题标题】:How to combine dictionaries that have the same element inside a list?如何组合列表中具有相同元素的字典?
【发布时间】:2019-08-19 15:18:33
【问题描述】:

我有一个字典列表。一些字典共享相同的元素。

data = [
                 {'New_PCP_Name': 'Jack0',
                  'Member_Name': 'Jack0, 0',
                  'Member_ID': '111',
                  'DOB': '111',
                  'PCP_ID':'111'
                  },
                 {'New_PCP_Name': 'Jack0',
                  'Member_Name': 'Jack00, 00',
                  'Member_ID': '222',
                  'DOB': '222',
                  'PCP_ID':'111'
                  },
                    {'New_PCP_Name': 'Jack1',
                     'Member_Name': 'Jack1, 1',
                     'Member_ID': '333',
                     'DOB': '333',
                     'PCP_ID':'333'
                     },
                    {'New_PCP_Name': 'Jack2',
                     'Member_Name': 'Jack2, 2',
                     'Member_ID': '444',
                     'DOB': '444',
                     'PCP_ID':'444'
                     }
                 ]

我需要将它们组合成特定的格式。前 2 个字典共享相同的元素“New_PCP_Name”:“Jack0”。所以我想把它们结合起来。最终产品如下。这种格式必须完全像这样,因为我需要在从 Excel 导入的数据的邮件合并中使用这种格式。

data = [
                 {'New_PCP_Name': 'Jack0',
                  'PCP_ID':'111',
                  'Member_Name':[{'Member_Name':'Jack0, 0','Member_ID':'111','DOB':'111'},
                               {'Member_Name': 'Jack00, 00', 'Member_ID': '222', 'DOB': '222'}] 
                  },
                    {'New_PCP_Name': 'Jack1',
                     'Member_Name': 'Jack1, 1',
                     'Member_ID': '333',
                     'DOB': '333',
                     'PCP_ID':'333'
                     },
                    {'New_PCP_Name': 'Jack2',
                     'Member_Name': 'Jack2, 2',
                     'Member_ID': '444',
                     'DOB': '444',
                     'PCP_ID':'444'
                     }
                 ]

我是 python 新手。我尝试分解列表,修改字典并将它们重新组合在一起,如下所示。那没有成功。请帮我弄清楚如何重新格式化字典列表。或者有没有办法为共享相同单元格值的行以特定格式从 Excel 导入数据?

data2=[]
for x in range (0,len(data),1):
    print(x)
    print(data[x])
    a = data[x]
    print(a['New_PCP_Name'])
    if x+1<=len(data):
        if data[x]['New_PCP_Name'] == data[x+1]['New_PCP_Name']:
            print('yes')
            data2.append(data[x])
        else:
            print('no')

print('data2=', data2)

【问题讨论】:

    标签: python excel python-3.x list data-dictionary


    【解决方案1】:

    一种可能性是使用itertools.groupby (doc):

    data = [
                     {'New_PCP_Name': 'Jack0',
                      'Member_Name': 'Jack0, 0',
                      'Member_ID': '111',
                      'DOB': '111',
                      'PCP_ID':'111'
                      },
                     {'New_PCP_Name': 'Jack0',
                      'Member_Name': 'Jack00, 00',
                      'Member_ID': '222',
                      'DOB': '222',
                      'PCP_ID':'111'
                      },
                        {'New_PCP_Name': 'Jack1',
                         'Member_Name': 'Jack1, 1',
                         'Member_ID': '333',
                         'DOB': '333',
                         'PCP_ID':'333'
                         },
                        {'New_PCP_Name': 'Jack2',
                         'Member_Name': 'Jack2, 2',
                         'Member_ID': '444',
                         'DOB': '444',
                         'PCP_ID':'444'
                         }
                     ]
    
    from itertools import groupby
    
    out = []
    for v, g in groupby(sorted(data, key=lambda k: k['New_PCP_Name']), lambda k: (k['New_PCP_Name'], k['PCP_ID'])):
        l = [*g]
        if len(l) == 1:
            out.append(l[0])
        else:
            pcp_id = None
            for i in l:
                del i['New_PCP_Name']
                del i['PCP_ID']
            out.append({'New_PCP_Name': v[0],
                        'PCP_ID': v[1],
                      'Member_Name':l
                      })
    
    from pprint import pprint
    pprint(out)
    

    打印:

    [{'Member_Name': [{'DOB': '111', 'Member_ID': '111', 'Member_Name': 'Jack0, 0'},
                      {'DOB': '222',
                       'Member_ID': '222',
                       'Member_Name': 'Jack00, 00'}],
      'New_PCP_Name': 'Jack0',
      'PCP_ID': '111'},
     {'DOB': '333',
      'Member_ID': '333',
      'Member_Name': 'Jack1, 1',
      'New_PCP_Name': 'Jack1',
      'PCP_ID': '333'},
     {'DOB': '444',
      'Member_ID': '444',
      'Member_Name': 'Jack2, 2',
      'New_PCP_Name': 'Jack2',
      'PCP_ID': '444'}]
    

    【讨论】:

    • 非常感谢。但是,我发现除了“New_PCP_Name”之外,我还需要带出另一个字段。假设在原始数据中,我有一个额外的字段 PCP_ID 需要与结果中的“New_PCP_Name”处于同一级别。我该怎么办?
    【解决方案2】:

    试试

    new_data_dic = {}
    for e in data:
        new_name = e['New_PCP_Name']
        if new_name not in new_data_dic:
            new_data_dic[new_name] = e.copy()
        else:
            if type(new_data_dic[new_name]['Member_Name'] == str):
                inner = new_data_dic[new_name].copy()
                del inner['New_PCP_Name']
                del new_data_dic[new_name]['Member_ID']
                del new_data_dic[new_name]['DOB']
                new_data_dic[new_name]['Member_Name'] = [inner]
            inner = e.copy()
            del inner['New_PCP_Name']
            new_data_dic[new_name]['Member_Name'].append(inner)
    data2 = list(new_data_dic.values())
    

    解释:'New_PCP_Name' 是一个键,所以我创建了一个字典。我将'Member_Name' 转换为一个列表,以防我看到同一个键再次出现。在随后的出场中,我可以追加。

    【讨论】:

    • 谢谢。但是,结果中第一个字典的末尾有 2 个额外元素:data2 = [{'New_PCP_Name': 'Jack0', 'Member_Name': [{'Member_Name': 'Jack0, 0', 'Member_ID': '111', 'DOB': '111'}, {'Member_Name': 'Jack00, 00', 'Member_ID': '222', 'DOB': '222'}], 'Member_ID': '111', 'DOB': '111'}, {'New_PCP_Name': 'Jack1', 'Member_Name': 'Jack1, 1', 'Member_ID': '333', 'DOB': '333'}, {'New_PCP_Name': 'Jack2', 'Member_Name': 'Jack2, 2', 'Member_ID':'444','DOB':'444'}]````
    • 您可以使用del 删除这些字段。我已经更新了答案并添加了两个删除这些字段的新行。
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2018-10-20
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多