优化在python中合并两个字典列表

时间:2018-02-14 07:38:23

标签: python dictionary optimization

我有两个列表,每个列表包含10-15k字典。 第一个名为campaigns的列表,它包含具有以下结构的字典:

{u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u'start_date': u'2018-02-13'}

和第二个列表 - yesterday_data dict的结构是:

{u'cost': 0.0, u'campaign_id': u'400037', u'revenue': 0.0}

目标是匹配广告系列ID,并在campaigns_data中向相关字典添加两个密钥,其中yesterday_date["revenue"]yesterday_date["cost"]将成为campaigns_data字典中的新密钥 - { {1}}和yesterday_cost

我设法使用以下代码实现此逻辑:

yesterday_revenue

但是每个列表中的这些字典数量非常慢,我想相信,远远不是实现这一目标的最佳方式。 任何想法如何改进我的代码以获得相同的结果?

3 个答案:

答案 0 :(得分:1)

id分组并减少:

grouper = {}
for d in campaigns_data:
    grouper[d["campaign_id"]] = d

# assuming the keys match up:

for d in yesterday_data:
    grouper[["campaign_id"]].update(yesterday_spend=d['cost'],
                                    yesterday_revenue=d['revenue'])

答案 1 :(得分:0)

尝试:

>>> d1 = {u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u'start_date': u'2018-02-13'}
>>> d2 = {u'cost': 0.0, u'campaign_id': u'400037', u'revenue': 0.0}

>>> if d1["campaign_id"] == d2["campaign_id"]:
      d1.update(d2)

输出

{u'roi': 0, u'ctr': u'1.1210', u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'campaign_id': u'400037', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 0.0, u'start_date': u'2018-02-13'}

答案 2 :(得分:0)

使用pandas来做到这一点。将这些词典转换为pandas数据帧,然后合并它们。

注意:我这样做了一行。如果您有100行,则将index=[0]替换为我正在构建index = range(100)df_1

的行中的df_2
campaigns = {u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u'start_date': u'2018-02-13'}

yesterday_data = {u'cost': 0.0, u'campaign_id': u'400037', u'revenue': 0.0}

import pandas as pd
df1 = pd.DataFrame(campaigns, index=[0])
df2 = pd.DataFrame(yesterday_data, index=[0])

df_new = df1.merge(df2, on=['campaign_id'])

要取回字典表格,请执行:

df_new.to_dict(orient='records')

注2 : 例如,来自yesterday_data的密钥(例如costrevenue)将以_y作为后缀结束,来自campaigns的密钥将具有后缀{{ 1}}。这是针对两个数据帧之间通用的键。