我有两个列表,每个列表包含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
但是每个列表中的这些字典数量非常慢,我想相信,远远不是实现这一目标的最佳方式。 任何想法如何改进我的代码以获得相同的结果?
答案 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
的密钥(例如cost
和revenue
)将以_y
作为后缀结束,来自campaigns
的密钥将具有后缀{{ 1}}。这是针对两个数据帧之间通用的键。