【问题标题】:Merging a list of dictionaries合并字典列表
【发布时间】:2021-07-29 10:13:44
【问题描述】:

我有一个如下的字典列表。

list = [ {id: 1, s_id:2, class: 'a', teacher: 'b'} ]
list1 = [ {id: 1, c_id:1, rank:2, area: 34}, {id:1, c_id:2, rank:1, area: 21} ]

我想合并公共键值对上的两个列表(在本例中为 'id:1')

Merged_list = [ {id:1, s_id:2, class: 'a', teacher: 'b', list1: {c_id:1, rank: 2, area: 34}, {c_id:2, rank: 1, area: 21} ]  

我该怎么做?

谢谢

【问题讨论】:

  • 字典是否总是这样排列,所以第一个与另一个列表中的第一个一起使用,等等?
  • 是的,@Mark。两个列表中的第一个键始终相同

标签: list dictionary merge


【解决方案1】:

你可以使用

merged_list = [{**d1, **d2} for d1, d2 in zip(list1, list2)]

>>> merged_list
    [{'id': 1, 's_id': 2, 'class': 'a', 'teacher': 'b', 'rank': 2, 'area': 34},
     {'id': 2, 's_id': 3, 'class': 'c', 'teacher': 'd', 'rank': 1, 'area': 21}]

{**d1, **d2} 只是组合两个字典的一种巧妙方法。请记住,这将替换第一个字典的重复键。如果您使用的是 Python 3.9,则可以使用 d1 | d2

编辑:对于您的问题中的编辑,您可以尝试这个可怕的一个衬里(请记住,如果在 list1 上没有找到匹配的索引,这将创建一对 list1: []):

list_ = [{"id": 1, "s_id": 2, "class": 'a', "teacher": 'b'}]
list1 = [{"id": 1, "c_id": 1, "rank": 2, "area": 34}, {"id": 1, "c_id": 2, "rank": 1, "area": 21}]

merged_list = [{**d, **{"list1": [{k: v for k, v in d1.items() if k != "id"} for d1 in list1 if d1["id"] == d["id"]]}} for d in list_]

>>> merged_list
    [{'id': 1,
      's_id': 2,
      'class': 'a',
      'teacher': 'b',
      'list1': [{'c_id': 1, 'rank': 2, 'area': 34},
       {'c_id': 2, 'rank': 1, 'area': 21}]}]

这相当于(有一些额外的好处):

merged_list = []
for d in list_:
    matched_ids = []
    for d1 in list1:
        if d["id"] == d1["id"]:
            d1.pop("id") # remove id from dictionary before appending
            matched_ids.append(d1)
            
    if matched_ids: # added benefit of not showing the 'list1' key if matched_ids is empty
        found = {"list1": matched_ids}
    else:
        found = {}
        
    merged_list.append({**d, **found})

【讨论】:

  • list = [ {id: 1, s_id:2, class: 'a', teacher: 'b'} ] list1 = [ {id: 1, c_id:1, rank:2, area : 34}, {id:1, c_id:2, rank:1, area: 21} ] Merged_list = [ {id:1, s_id:2, class: 'a', teacher: 'b', list1: {c_id :1, rank: 2, area: 34}, {c_id:2, rank: 1, area: 21} ] 说得非常具体,这是我需要执行的操作。
  • 您需要更新您的问题。这根本不是那里所描绘的。
  • 我得到一个关键错误:'id' 我不知道会发生这种情况。
  • 您的字典构建错误。例如,使用"id",而不是id
  • 我实际上已经使用 df.to_dict() 函数将数据帧转换为字典。所以我不认为错误的结构是一个问题。
【解决方案2】:

试试这个

并且不要忘记在声明字符串时加上“”

list = [ {"id": 1, "s_id": 2  ," class": 'a', "teacher": 'b'}, {"id": 2, "s_id" : 3, "class" : 'c', "teacher": 'd'} ]
list1 = [ {"id": 1, "rank" :2, "area" : 34}, {"id" :2, "rank" :1, "area": 21} ]

list2 = list1 + list
print(list2)

【讨论】:

  • 这不起作用。这只是扩展了两个列表,这意味着 list2 现在里面有 4 个字典。
猜你喜欢
  • 2012-08-11
  • 2012-07-17
  • 2020-12-28
  • 2017-04-11
  • 2021-10-06
  • 2018-03-25
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多