【问题标题】:How can I merge two dictionaries with multiple key value pairs如何合并具有多个键值对的两个字典
【发布时间】:2017-07-14 01:21:09
【问题描述】:

我有两个字典,如下所示。我在 Python 2.7 上。

entries_per_day = [ {"time": "October 1", "entries": "5" }, 
                {"time": "October 2", "entries": "3" }, 
                {"time": "October 3", "entries": "1" }, 
                {"time": "October 4", "entries": "0" }, 
                {"time": "October 5", "entries": "23" }]

views_per_day = [ {"time": "October 1", "views": "9" }, 
              {"time": "October 2", "views": "3" }, 
              {"time": "October 3", "views": "5" }, 
              {"time": "October 4", "views": "6" }, 
              {"time": "October 5", "views": "32" }]   

如何将两个字典合并为第三个,以便输出如下所示:

area_chart_data = [ {"time": "October 1", "entries": "5", "views": "9" }, 
                {"time": "October 2", "entries": "3", "views": "3" }, 
                {"time": "October 3", "entries": "1", "views": "5" }, 
                {"time": "October 4", "entries": "0", "views": "6" }, 
                {"time": "October 5", "entries": "23", "views": "32" }]

我希望“条目”和“视图”键值对与它们最初使用的日期位于同一数据段中。

【问题讨论】:

  • 它们不是 2 个字典,它们是 2 个列表,每个列表包含多个字典。
  • 您的尝试是否无效?如果是这样,请将其连同其输出(或它生成的异常)一起包含在问题中。
  • 字典列表是否总是有序的,就像示例中一样?

标签: python python-2.7


【解决方案1】:

由于字典条目似乎匹配,只需zip 两个列表并用第二个字典更新一个字典,然后插入一个列表。

area_chart_data = []

for e,v in zip(entries_per_day,views_per_day):
    e.update(v)
    area_chart_data.append(e)

print(area_chart_data)

结果:

[{'views': '9', 'time': 'October 1', 'entries': '5'}, {'views': '3', 'time': 'October 2', 'entries': '3'}, {'views': '5', 'time': 'October 3', 'entries': '1'}, {'views': '6', 'time': 'October 4', 'entries': '0'}, {'views': '32', 'time': 'October 5', 'entries': '23'}]

它改变了第一个列表。如果你不想这样,你必须在更新前做e = e.copy()

编辑:使用this Q&A 中所述的“字典添加”的单行:

area_chart_data = [dict(e, **v) for e,v in zip(entries_per_day,views_per_day)]

【讨论】:

    【解决方案2】:

    在最简单的形式中,您遍历一个字典并在第二个字典中搜索相同的键。找到后,将第一个字典 entries_per_day 复制到新字典,这样您的新字典将包含键“时间”、“条目”及其值。然后使用键 'view' 更新新字典,它的值来自第二个字典 views_per_day。现在,将其附加到列表 area_chart_data

    >>> area_chart_data = []
    >>> for d in entries_per_day:
    ...     for f in views_per_day:
    ...         if d["time"] == f["time"] :
    ...             m = dict(d)
    ...             m["views"] = f["views"]
    ...             area_chart_data.append(m)
    

    结果:

    >>> area_chart_data
    [{'time': 'October 1', 'entries': '5', 'views': '9'}, 
     {'time': 'October 2', 'entries': '3', 'views': '3'}, 
     {'time': 'October 3', 'entries': '1', 'views': '5'}, 
     {'time': 'October 4', 'entries': '0', 'views': '6'}, 
     {'time': 'October 5', 'entries': '23', 'views': '32'}]
    

    【讨论】:

    • 您的回答被标记为“低质量”。我将输出添加到它,这样它就不会被删除,因为您是 SO 新手。请记住在可能的情况下显示您的输出,并解释您的代码是如何工作的,以便将来使用这些页面。
    【解决方案3】:

    “Raw”解决方案使用dict.update 方法:

    area_chart_data = []
    for entry in entries_per_day:
        for view in views_per_day:
            if entry['time'] == view['time']:
                d = entry.copy()
                d.update(view)
                area_chart_data.append(d)
    
    print area_chart_data
    

    输出:

    [{'time': 'October 1', 'views': '9', 'entries': '5'}, {'time': 'October 2', 'views': '3', 'entries': '3'}, {'time': 'October 3', 'views': '5', 'entries': '1'}, {'time': 'October 4', 'views': '6', 'entries': '0'}, {'time': 'October 5', 'views': '32', 'entries': '23'}]
    

    您也可以使用单个列表推导:

    area_chart_data = [dict(entry, **view) for entry in entries_per_day 
                       for view in views_per_day if entry['time'] == view['time']]
    

    【讨论】:

      【解决方案4】:

      尝试使用 zip 并使用 dict-2 更新 dict-1

      lst1 = [ {"time": "October 1", "entries": "5" }, 
               {"time": "October 2", "entries": "3" }, 
             ]
      
      lst2 = [ {"time": "October 1", "views": "9" }, 
               {"time": "October 2", "views": "3" }, ]
      
      
      for x,y in zip(lst1,lst2):
          x.update(y)
      
      print lst1
      

      输出:

      [{'views': '9', 'entries': '5', 'time': 'October 1'}, {'views': '3', 'entries': '3', 'time': 'October 2'}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多